2012-07-06 109 views
4

我试图编译一个依赖于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 
... 

我还提取从库中的目标文件,并用“纳米”,以确保我打电话的功能确实存在:

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 

任何想法?

+0

这可能是不同编译器使用的不同名称修改架构的问题。你能否在你的目标文件和库上提供nm结果而没有--demangle选项? – 2012-07-12 22:07:22

+0

你使用的库的正确分布? xerces-c_2_8_0-x86-linux-gcc_3_4.tar.gz?还是你自己在gcc上建立图书馆? – carlsborg 2012-07-15 09:47:27

回答

4

你没有说出档案的来源。如果它没有用cygwin编译,它可能是一个名称混淆问题。从源代码编译库可能会解决这个问题。

也可能是因为档案的构建不正确而导致内部出现分辨率问题。尝试给库名称两次。

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

如果这个工作,存档被打破,你应该寻找或建立一个新的。

+0

感谢您的建议。我使用的档案没有用Cygwin编译。我编译了源代码中的所有内容,并解决了链接器错误。谢谢您的帮助! – theisenp 2012-07-15 16:46:30

7

您的项目使用来自xercesc_2_6命名空间的方法,正如编译器错误消息指出的,但您的库提供了xercesc_2_8版本。问题可能是由您使用的标题与库对象文件之间的不匹配造成的。

+0

谢谢,赶上!我修复了项目使用xerces_2_8的头文件和库,但我仍然得到相同的错误。我已更新我的问题以反映新版本。 – theisenp 2012-07-06 18:51:13

1

尝试链接器选项--enable-stdcall-fixup(请参阅'man ld')。它会关心名称修改和调用约定:

g++ -o test.exe test.o -Wl,--enable-stdcall-fixup -Llib -lxerces-c 
相关问题