我在工作中的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;
}
一切都很好,花花公子。
如果不使用某些东西,我怎么能得到链接器错误?我想知道是否有人之前遇到过类似的经历,如果他们找到了导致它的原因。
很抱歉,我无法发布更多代码,因为它是公司财产。 非常感谢提前!
答案 0 :(得分:3)
连接器很复杂,这种行为绝非不寻常。这是一个可能的解释:
libfoo.a
进行链接。libfoo.a
包含foo.o
,其中包含SW_Agent_PP::SW_Agent_PP()
和其他一系列功能。libbar.a
之后列出的另一个库libfoo.a
使用libfoo.a
中的一堆其他函数。链接器按顺序处理静态库,永远不会返回。因此,libbar.a
中的引用只有在libfoo.a
main()
从{{1}}拉出相应对象时才能满足。
解决方案是重新排序链接行中的库。
还有其他可能的解释。没有看到实际代码就很难分辨。