编译c ++文件时出错:未定义的符号

时间:2012-10-05 15:04:08

标签: c++ linker g++

我正在尝试编译其他人的C ++代码。我自己有0个C ++经验。我在MAC上使用g ++来编译我收到的一个.cpp文件。当我g++ main.cpp时,我收到一个未定义的符号错误。当谷歌搜索答案似乎是文件之间的错误链接,但我不知道如何链接文件。 如何让文件编译?我粘贴了下面的完整代码。

Undefined symbols:
  "initializeFitness()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Grid::GetNeighbourhood(int, int, std::vector<Agent**, std::allocator<Agent**> >&)", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Grid::Grid()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Reaper::GetAgentToKill()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Cupid::GetRandomBreeder()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Reaper::Select()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Grid::~Grid()", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Breeder::Breed(Agent**, Agent**)", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Cupid::Select()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Cupid::GetEmptyCell()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Agent::GetType()", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Breeder::ProcessNeighbourhood(std::vector<Agent**, std::allocator<Agent**> > const&)", referenced from:
      runEvolution()     in ccZXBTDH.o
  "FateAgent::GetGenome(double*)", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Cupid::GetParents()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Agent::IncreaseAge()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Grid::GetAgent(int, int)", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "FateAgent::GetSelectedCount()", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Breeder::GetGenome(double*)", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Agent::GetFitness()", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Agent::~Agent()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Grid::DoMovement()", referenced from:
      runEvolution()     in ccZXBTDH.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

5 个答案:

答案 0 :(得分:5)

我认为你只是想编译整个程序的一部分。试试g++ *.cpp
如果它仍然无法工作,可能是因为你的程序需要一个外部库。

答案 1 :(得分:4)

g ++找不到一堆符号,没有进一步了解你的情况 - 我猜你在链接之前没有编译所有的源代码文件。

更多背景:

当您调用g ++只是一个源文件参数时,它会编译该文件,然后尝试将其链接到完整的可执行文件。

我的建议是使用-c标志编译每个源文件(-c标志告诉编译器将文件编译为目标代码,但不将其链接到可执行文件中)。

g++ -c main.cpp
g++ -c file1.cpp
g++ -c file2.cpp

上述命令将创建.cpp替换为.o的目标文件。然后,您可以通过执行类似

的操作将它们全部链接在一起
g++ main.o file1.o file2.o

这将生成一个可以运行的可执行文件a.out。这可以帮助您丢失符号链接器错误。

如果您要做比这更复杂的事情,我强烈建议您调查使用Makefile来构建代码。

答案 2 :(得分:2)

我只能猜到这里。项目中有多少个文件?它有没有图书馆?

如果您有库,则需要将它们与-l开关

链接
g++ -o output_binary_name source_file -lLibrary1 -lLibrary2

或者很可能你在项目中有多个源文件,你需要枚举它们

g++ -o output_binary_name source_file1 source_file2 source_file2

答案 3 :(得分:1)

我不认为那是代码,我认为是调试输出。

runEvolution()使用尚未定义的函数。寻找那些的定义。

就像很多人建议的那样,你可能会遗漏一些文件,gcc显然会错过你的代码。

祝你好运!

答案 4 :(得分:1)

假设程序没有使用任何库,您应该使用-c开关编译所有文件,然后将它们完全链接到:

g++ -c main.cpp
g++ -c file1.cpp
..
g++ *.o

或者你可以自动执行相同的操作:

g++ *.cpp