链接到静态库时未定义的引用错误

时间:2012-07-06 17:40:10

标签: c++ g++ cygwin static-linking undefined-reference

我正在尝试编译一个依赖于Xerces XML Parser的项目。该项目没有任何困难地为Windows编译,但我在使用Cygwin中的g ++编译时遇到了一些麻烦。

为了使用Xerces,我试图针对静态库libxerces-c.a编译我的代码。但是当我这样做时,我会得到如下错误:

/tmp/cc2QGvMh.o:test.cpp:(.text+0x3a): undefined reference to `xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)'

我使用ar检查了静态库,并确认它包含定义我正在调用的函数的DOMImplementationRegistry.o文件。

ar -t libxerces-c.a
...
DOMImplementationImpl.o
DOMImplementationRegistry.o
DOMLocatorImpl.o
...

我还从库中提取了目标文件,并使用'nm'来确保我调用的函数实际存在:

ar -x libxerces-c.a
nm --demangle DOMImplementationRegistry.o
...
00000080 T xercesc_2_8::getDOMImplSrcVectorMutex()
00000300 T xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)
000002a0 T xercesc_2_8::DOMImplementationRegistry::addSource(xercesc_2_8::DOMImplementationSource*)
...

由于我可以为Windows编译所有内容但不能用g ++编译,我认为错误可能在链接器顺序中(类似于this question中描述的问题)。但是,即使更改了链接器顺序,我仍然会得到相同的编译器错误。我试过了两个

g++ -o test.exe test.cpp -Llib -lxerces-c

g++ -o test.exe test.cpp lib/libxerces-c.a

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

您的项目使用xercesc_2_6命名空间中的方法,如编译器错误消息所指示,但您的库提供了xercesc_2_8版本。问题可能是由您使用的标头与库对象文件不匹配引起的。

答案 1 :(得分:4)

您没有说出档案的来源。如果它不是用cygwin编译的,那么它可能是一个名称错误问题。从源代码编译库可能会解决这个问题。

也可能是存档构建错误,因此存在内部解析问题。尝试两次提供库名称。

g++ -o test.exe test.cpp lib/libxerces-c.a lib/libxerces-c.a

如果这样做,存档就会中断,您应该查找或构建一个新存档。

答案 2 :(得分:1)

尝试使用链接器选项--enable-stdcall-fixup(参见'man ld')。它将关注名称修改和调用约定:

g++ -o test.exe test.o -Wl,--enable-stdcall-fixup -Llib -lxerces-c