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

时间:2015-08-07 18:42:22

标签: c++ c++11 namespaces

当我尝试编译程序时出现此/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.cpp g++ -std=c++11 -c Dungeon.cpp,然后将它们链接起来,但却出现了同样的错误。可能是什么问题?

1 个答案:

答案 0 :(得分:8)

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