【问题标题】:Linker can't find function definition in a namespace链接器在命名空间中找不到函数定义
【发布时间】:2015-10-31 07:16:52
【问题描述】:

当我试图编译我的程序时,我得到了这个/tmp/ccnL7Yz1.o: In function 'main': main.cpp:(.text+0x70): undefined reference to 'dng::genDungeon()' main.cpp:(.text+0xf0): undefined reference to 'dng::clrDungeon(char**)' collect2: error: ld returned 1 exit status 错误。在我添加命名空间函数之前它工作得很好。我是这样编译的:g++ -std=c++11 main.cpp Dungeon.cpp

地牢.h

namespace dng {
    char** genDungeon();
    void clrDungeon(char**);

    class Dungeon {
    //Methods and variables
    }
}

地牢.cpp

#include "Dungeon.h"

using namespace dng;
char** genDungeon() 
{
    //Stuff
}
void clrDungeon(char** dungeon) 
{
    //Another Stuff
}
/*Implementation of class methods
void Dungeon::genStart(){} -> like this */

main.cpp

#include "Dungeon.h"

int main () 
{
    //Stuff
    auto dungeon = dng::genDungeon();
    //Stuff
    dng::clrDungeon(dungeon);
    return 0;
}

我也尝试自己制作.o文件g++ -std=c++11 -c main.cppg++ -std=c++11 -c Dungeon.cpp然后链接它们,但得到了同样的错误。可能是什么问题?

【问题讨论】:

  • 我正在投票重新打开它。原标题有duplicate的味道,但问题其实是对using namespace的误解。
  • @Борис Кот Такие вопросы лучше задавать на ru.stackoverflow.:)
  • @zenith 我搜索了很多,但没有找到类似的东西。而且您的链接似乎无法解决我的问题。

标签: c++ c++11 scope namespaces function-declaration


【解决方案1】:

将函数定义包含在声明它们的命名空间 dng 中。

#include "Dungeon.h"

namespace dng
{
char** genDungeon() 
{
    //Stuff
}
void clrDungeon(char** dungeon) 
{
    //Another Stuff
}
//...
}

或者使用限定名。

include "Dungeon.h"

using namespace dng;

//...

char** dng::genDungeon() 
{
    //Stuff
}
void dng::clrDungeon(char** dungeon) 
{
    //Another Stuff
}

否则,函数是在全局命名空间中定义的,因此,您声明了四个函数:两个在命名空间dng 中,另外两个在全局命名空间中。

【讨论】:

  • 回答明显的重复可以鼓励创建它们。不要这样做。
  • @Mateusz Grzejek 对不起。我没听懂你说的。
  • 第二种情况不需要using namespace dng;
  • @MateuszGrzejek 我不认为这是重复的。
  • @VladfromMoscow 哦,你是这个意思。您通常在 C++ 中将它们称为源文件,而不是“模块”。
猜你喜欢
  • 2023-04-08
  • 2019-07-16
  • 1970-01-01
  • 2012-12-16
  • 2022-11-23
  • 1970-01-01
  • 2012-01-20
  • 2020-05-05
  • 1970-01-01
相关资源
最近更新 更多