链接到静态库时出现未定义的引用错误
Undefined Reference Error When Linking to Static Library
我正在尝试编译一个依赖于Xerces XML解析器的项目。 该项目毫无困难地为 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++ 编译,因此我认为错误可能出现在链接器顺序中(类似于此问题中描述的问题)。 但是,即使在更改链接器顺序后,我仍然收到相同的编译器错误。 我都试过了
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版本。问题可能是由您使用的标头与库对象文件不匹配引起的。
你没有说档案的来源。如果它不是用cygwin编译的,这可能是一个名称重整问题。 从源代码编译库可能会很好地解决此问题。
也可能是存档构建不正确,因此存在内部解析问题。 尝试为库命名两次。
g++ -o test.exe test.cpp lib/libxerces-c.a lib/libxerces-c.a
如果这有效,则存档已损坏,您应该寻找或构建一个新存档。
尝试链接器选项 --enable-stdcall-fixup(参见 'man ld')。它将关注名称重整和调用约定:
g++ -o test.exe test.o -Wl,--enable-stdcall-fixup -Llib -lxerces-c
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用