链接器在命名空间中找不到函数定义
Posted
技术标签:
【中文标题】链接器在命名空间中找不到函数定义【英文标题】: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.cpp
g++ -std=c++11 -c Dungeon.cpp
然后链接它们,但得到了同样的错误。可能是什么问题?
【问题讨论】:
你可以先搜索一下:What is an undefined reference/unresolved external symbol error and how do I fix it? 我正在投票重新打开它。原标题有duplicate的味道,但问题其实是对using namespace
的误解。
@Борис Кот Такие вопросы лучше задавать на ru.***.:)
@zenith 我搜索了很多,但没有找到类似的东西。而且您的链接似乎无法解决我的问题。
【参考方案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++ 中将它们称为源文件,而不是“模块”。以上是关于链接器在命名空间中找不到函数定义的主要内容,如果未能解决你的问题,请参考以下文章