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

the*_*enp 4 c++ cygwin g++ undefined-reference static-linking

我正在尝试编译依赖于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*)'
Run Code Online (Sandbox Code Playgroud)

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

ar -t libxerces-c.a
...
DOMImplementationImpl.o
DOMImplementationRegistry.o
DOMLocatorImpl.o
...
Run Code Online (Sandbox Code Playgroud)

我还从库中提取了目标文件,并使用'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*)
...
Run Code Online (Sandbox Code Playgroud)

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

g++ -o test.exe test.cpp -Llib -lxerces-c
Run Code Online (Sandbox Code Playgroud)

g++ -o test.exe test.cpp lib/libxerces-c.a
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 7

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