奇怪的'未定义引用'错误

时间:2011-08-23 14:24:15

标签: c++

我在工作中的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 个答案:

答案 0 :(得分:3)

连接器很复杂,这种行为绝非不寻常。这是一个可能的解释:

  1. 您正在使用静态库libfoo.a进行链接。
  2. libfoo.a包含foo.o,其中包含SW_Agent_PP::SW_Agent_PP()和其他一系列功能。
  3. 在链接行libbar.a之后列出的另一个库libfoo.a使用libfoo.a中的一堆其他函数。
  4. 链接器按顺序处理静态库,永远不会返回。因此,libbar.a中的引用只有在libfoo.a main()从{{1}}拉出相应对象时才能满足。

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

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