链接器无法在命名空间中找到函数定义

11

我尝试编译我的程序时出现了以下错误:/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

Dungeon.h

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

    class Dungeon {
    //Methods and variables
    }
}

Dungeon.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来进行链接,但仍然出现了相同的错误。可能是什么问题呢?


2
我投票重新开放这个问题。原标题有点像“重复”,但实际上这个问题是关于对using namespace的误解。 - Drew Dormann
@Борис Кот,这类编程问题最好在ru.stackoverflow上提问。 :) - Vlad from Moscow
@zenith 我搜索了很多,但没有找到类似的东西。而且你提供的链接似乎并不能解决我的问题。 - Борис Кот
1个回答

12

将函数定义封装在它们声明的命名空间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 中,另外两个在全局命名空间中。


1
回答显然的重复问题会鼓励人们再次提问。请不要这样做。 - Mateusz Grzejek
1
@Mateusz Grzejek,很抱歉,我没有理解你所说的话。 - Vlad from Moscow
2
在第二种情况下,你不需要使用 using namespace dng; - emlai
3
@MateuszGrzejek 我认为这不是重复的。 - Борис Кот
1
@VladfromMoscow 哦,你是指那个。在C++中,你通常把它们称为源文件,而不是“模块”。 - emlai
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接