调用将对象向量作为参数的函数时出现链接错误
Posted
技术标签:
【中文标题】调用将对象向量作为参数的函数时出现链接错误【英文标题】:Linking error when calling a function that takes a vector of objects as it's argument 【发布时间】:2011-02-22 09:28:12 【问题描述】:我有一个将对象向量作为参数的函数。函数头是:
void Evolve(vector <C_Agent> &population)
只要我不尝试实际调用该函数,代码就会正确编译。我这样称呼它:
vector <C_Agent> AgentPopulation;
for(int q=0; q < x; q++)
AgentPopulation.push_back(C_Agent());
Evolve(AgentPopulation);
当我尝试调用它时,我得到了错误:
"Evolve(__gnu_debug_def::vector<C_Agent, std::allocator<C_Agent> >)", referenced from:
main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
我可以通过将参数更改为 int 而不是 C_Agent 的向量来消除错误。 我试过注释掉函数体,但这没有帮助。
【问题讨论】:
那么,源文件是什么?vector
是什么? (如果是std::vector
,为什么你在头文件中有一个 using 声明?)源文件是否被链接?
__gnu_debug_def::vector 看起来不像 std::vector。看起来打字不匹配。我建议你明确地使用 std::vector,看看错误是否仍然发生。
我认为 Xcode 可能有一个附加组件,因为我只是将 using 放在 main 中,并且它始终应用它。添加 std:: 不会改变任何东西
【参考方案1】:
来自binutils 的nm
是你的朋友。它会告诉您main.o
试图引用什么符号,以及另一个目标文件(其中包含已编译的函数定义)实际上正在公开的符号。两者之间的不匹配将导致您找到不匹配的原因,从而找到解决问题的方法。您没有为万维网上的人们提供足够的信息来为您诊断。
【讨论】:
我发现了问题所在。事实证明,在声明中我有“人口”,而在定义中我有“人口”。我猜是因为我正在使用向量,所以它没有给我一个更明显的错误(只要我没有调用该函数就让我编译)?以上是关于调用将对象向量作为参数的函数时出现链接错误的主要内容,如果未能解决你的问题,请参考以下文章
将 Cocoa Touch 框架链接到 Today Extension 时出现链接器错误