我正在尝试编译其他人的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
答案 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