【问题标题】:Undefined Reference Error When Linking to Static Library链接到静态库时出现未定义的引用错误
【发布时间】:2012-07-07 04:53:32
【问题描述】:

我正在尝试编译一个依赖于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

有什么想法吗?

【问题讨论】:

  • 这可能是不同编译器使用不同名称修饰模式的问题。您能否在没有 --demangle 选项的情况下在目标文件和库中提供 nm 的结果?
  • 您是否使用了正确的库分布? xerces-c_2_8_0-x86-linux-gcc_3_4.tar.gz ?还是您自己在 gcc 上构建了库?

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


【解决方案1】:

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

【讨论】:

  • 谢谢,好收获!我修复了项目以使用来自 xerces_2_8 的标头和库,但我仍然遇到相同的错误。我更新了我的问题以反映新版本。
【解决方案2】:

你没有说存档的来源。如果它不是用 cygwin 编译的,则可能是名称修改问题。从源代码编译库可能会解决这个问题。

也可能是存档构建不正确,因此存在内部解析问题。尝试两次给出库名称。

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

如果可行,则说明存档已损坏,您应该寻找或构建一个新存档。

【讨论】:

  • 感谢您的建议。我使用的存档不是用 Cygwin 编译的。我从源代码编译了所有内容,它解决了链接器错误。感谢您的帮助!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多