使用g++并出现链接器错误。我有一个简单的程序,该程序分为两个模块:main.cpp和Dice.h Dice.cpp。

main.cpp:

#include <iostream>
#include "Dice.h"

int main(int argc, char **argv) {

    int dieRoll = Dice::roll(6);
    std::cout<<dieRoll<<std::endl;

    std::cin.get();

    return 0;
}

Dice.h:
#ifndef DieH
#define DieH

namespace Dice
{
    int roll(unsigned int dieSize);
}

#endif

Dice.cpp:
#include <ctime>
#include <cstdlib>
#include "Dice.h"

namespace Dice
{
    int roll(unsigned int dieSize)
    {
        if (dieSize == 0)
        {
            return 0;
        }
        srand((unsigned)time(0));
        int random_int = 0;
        random_int = rand()%dieSize+1;

        return random_int;
    }
}

我使用g++编译和链接这些文件,如下所示:
g++ -o program main.cpp Dice.cpp

我收到以下链接器错误:
Undefined symbols:
"Dice::roll(int)", referenced from:
  _main in ccYArhzP.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

我完全被弄糊涂了。任何帮助将不胜感激。

最佳答案

您的代码格式正确。

确保您的文件名没有冲突,文件存在并且包含您认为的文件名。例如,也许您的Dice.cpp为空,并且您正在其他地方编辑一个新创建的main.cpp

通过删除不必要的文件来最大程度地减少差异;仅具有dice.hdice.cpp"Dice::roll(int)"

您的错误与您的代码int不匹配。观察到这是在寻找unsigned int,但是您的函数使用了main.o。确保标题匹配。

请尝试以下操作:

g++ main.cpp -c

这将生成dice.cpp,这是main的已编译但未链接的代码。用dice.o做同样的事情:
g++ dice.cpp -c

现在,您有两个需要链接在一起的对象文件。这样做:
g++ main.o dice.o

看看是否可行。如果不是,请执行以下操作:
nm main.o dice.o

这将列出对象中所有可用的符号,并应为您提供以下信息:
main.o:
00000000 b .bss
00000000 d .ctors
00000000 d .data
00000000 r .eh_frame
00000000 t .text
00000098 t __GLOBAL__I_main
00000069 t __Z41__static_initialization_and_destruction_0ii
         U __ZN4Dice4rollEj
         U __ZNSi3getEv
         U __ZNSolsEPFRSoS_E
         U __ZNSolsEi
         U __ZNSt8ios_base4InitC1Ev
         U __ZNSt8ios_base4InitD1Ev
         U __ZSt3cin
         U __ZSt4cout
         U __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
00000000 b __ZStL8__ioinit
         U ___gxx_personality_v0
         U ___main
00000055 t ___tcf_0
         U _atexit
00000000 T _main

dice.o:
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T __ZN4Dice4rollEj
         U _rand
         U _srand
         U _time

C++破坏了函数名,这就是为什么一切看起来都怪异的原因。 (注意,没有mangling names的标准方法,这就是GCC 4.4的操作方式)。

观察到main.o__ZN4Dice4rollEj引用相同的符号:dice.cpp。如果这些不匹配,那就是您的问题。例如,如果我将nm main.o dice.o的一部分更改为:
// Note, it is an int, not unsigned int
int roll(int dieSize)

然后main.o产生以下内容:
main.o:
00000000 b .bss
00000000 d .ctors
00000000 d .data
00000000 r .eh_frame
00000000 t .text
00000098 t __GLOBAL__I_main
00000069 t __Z41__static_initialization_and_destruction_0ii
         U __ZN4Dice4rollEj
         U __ZNSi3getEv
         U __ZNSolsEPFRSoS_E
         U __ZNSolsEi
         U __ZNSt8ios_base4InitC1Ev
         U __ZNSt8ios_base4InitD1Ev
         U __ZSt3cin
         U __ZSt4cout
         U __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
00000000 b __ZStL8__ioinit
         U ___gxx_personality_v0
         U ___main
00000055 t ___tcf_0
         U _atexit
00000000 T _main

dice.o:
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T __ZN4Dice4rollEi
         U _rand
         U _srand
         U _time

注意,这给出了两个不同的符号。 __ZN4Dice4rollEj寻找此内容:dice.o__ZN4Dice4rollEi包含此g++ main.o dice.o。 (最后一个字母不同)。

当尝试编译这些不匹配的符号(使用ojit_code)时,我得到:
undefined reference to `Dice::roll(unsigned int)'

关于c++ - Linker Hell中的C++新手,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1665269/

10-17 00:19