2011-08-23 106 views
0

我在工作中遇到了C++项目中的一个特殊错误。怪异'未定义参考'错误

我发现了一个修复程序,但我现在非常满意,因为我想了解实际导致错误的原因。

当建立这个代码片段:

#include <iostream> 
#include "snmp/snmp/SW_SNMP_Values.hpp" 
#include "snmp/agent/SW_Agent.hpp" 
#include "snmp/agent/SW_Agent_PP.hpp" 

int main() 
{ 
    //SW_Agent_PP agent; 

    return 0; 
} 

注意SW_Agent_PP被注释掉了!在构建这个时,对于SW_Agent_PP对象正在使用的类,我收到大量未定义的引用错误。

该FIX实际上是创建对象!所以如果我这样做:

#include <iostream> 
#include "snmp/snmp/SW_SNMP_Values.hpp" 
#include "snmp/agent/SW_Agent.hpp" 
#include "snmp/agent/SW_Agent_PP.hpp" 

int main() 
{ 
    SW_Agent_PP agent; 

    return 0; 
} 

一切工作正常和丹迪。

如何获取不使用某些链接器错误?我想听听有没有人遇到类似的经历,如果他们发现是什么造成的。

对不起,但我不能发布更多的代码,因为它是公司财产。 非常感谢提前!

+1

'SW_Agent_PP'的定义是什么?是宏吗? –

+0

听起来像是其中一个.hpp文件中的错误。可能是缺少分号。 –

+0

完整课程。拆分为头文件和.cpp文件 – Daniel

回答

3

链接器很复杂,这种行为绝非罕见。这里有一个可能的解释:

  1. 你正在链接一个静态库libfoo.a
  2. libfoo.a包含foo.o其中包含SW_Agent_PP::SW_Agent_PP()和一堆其他功能。
  3. 另一个库libbar.a,在libfoo.a之后列在链接行中,使用了libfoo.a中的一堆其他函数。

链接器按顺序处理静态库并永不回退。因此libbar.a中的引用只有在相应的对象从libfoo.amain()拉出时才能满足。

解决方案是重新排列链接行中的库。

还有其他可能的解释。没有看到实际的代码很难说。