0

我正在尝试编译别人的 C++ 代码。我自己对 C++ 的经验为 0。我在 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
4

5 回答 5

5

我认为您正在尝试仅编译整个程序的一部分。试试g++ *.cpp
如果还是不行,可能是因为你的程序需要外部库。

于 2012-10-05T15:11:24.923 回答
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 来构建代码。

于 2012-10-05T15:13:29.057 回答
2

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

如果您有库,则需要使用 -l 开关链接它们

g++ -o output_binary_name source_file -lLibrary1 -lLibrary2

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

g++ -o output_binary_name source_file1 source_file2 source_file2
于 2012-10-05T15:13:01.133 回答
1

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

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

就像很多人建议的那样,您可能会丢失一些文件,gcc 显然会丢失您的代码中的某些内容。

祝你好运!

于 2012-10-05T15:10:13.317 回答
1

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

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

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

g++ *.cpp
于 2012-10-05T15:13:36.957 回答