c++ - 链接到静态库时出现 undefined reference 错误

标签 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

有什么想法吗?

最佳答案

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

关于c++ - 链接到静态库时出现 undefined reference 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11367138/

相关文章:

c++ - 在对象实例上调用静态函数时解析错误?

c++ - 具有模板化继承的纯虚函数

c++ - 同一段代码,可以在xcode中编译,也可以在terminal中用g++、clang++编译,不能用gcc或clang编译。为什么?

windows - 如何让 Cygwin 准确读取我的 Windows 环境变量?

c++ - 实际使用捕获时未使用的 lambda 捕获警告

c++ - 需要帮助编码霍夫曼树

c++ - 重写虚方法时无法返回派生类指针

c++ - 错误 : ‘calcOpticalFlowPyrLK’ is not a member of ‘cv’ - OpenCV 2. 4.2

bash - Git Bash 错误 : could not fork child process

c++ - Cygwin GDB 在尝试启动程序时出现错误 193