针对boost python进行链接会在PyCEGUI中产生未定义的引用

Linking against boost-python yields undefined references in PyCEGUI

本文关键字:未定义 引用 PyCEGUI python boost 链接 针对      更新时间:2023-10-16

我正在尝试编译一个Python库(CEGUI可以构建Python模块,其编辑器依赖于此),该库需要链接到boost Python。所以我用构建了boost——用python构建得很好。

然而,只要链接了.pyd,我就会得到未定义的引用:

Linking CXX shared module ..........binPyCEGUI.pyd
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x97): undefined reference to `_imp___ZN5boost6python7objects10class_baseC2EPKcjPKNS0_9type_infoES4_'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x9c): undefined reference to `_imp___ZN5boost6python9converter8registry6insertEPFPvP7_objectEPFvS5_PNS1_30rvalue_from_python_stage1_dataEENS0_9type_infoEPFPK11_typeobjectvE
'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0xcc): undefined reference to `_imp___ZN5boost6python7objects23register_dynamic_id_auxENS0_9type_infoEPFSt4pairIPvS2_ES4_E'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0xf4): undefined reference to `_imp___ZN5boost6python7objects8add_castENS0_9type_infoES2_PFPvS3_Eb'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x1cd): undefined reference to `_imp___ZN5boost6python7objects17copy_class_objectERKNS0_9type_infoES4_'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x20d): undefined reference to `_imp___ZN5boost6python9converter8registry6insertEPFP7_objectPKvENS0_9type_infoEPFPK11_typeobjectvE'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x245): undefined reference to `_imp___ZN5boost6python7objects10class_base17set_instance_sizeEj'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x281): undefined reference to `_imp___ZN5boost6python7objects15function_objectERKNS1_11py_functionERKSt4pairIPKNS0_6detail7keywordES9_E'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x2f2): undefined reference to `_imp___ZN5boost6python7objects16add_to_namespaceERKNS0_3api6objectEPKcS5_S7_'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x348): undefined reference to `_imp___ZN5boost6python6detail13current_scopeE'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x4d1): undefined reference to `_imp___ZN5boost6python9converter8registry9push_backEPFPvP7_objectEPFvS5_PNS1_30rvalue_from_python_stage1_dataEENS0_9type_infoEPFPK11_typeobjectvE'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x636): undefined reference to `_imp___ZN5boost6python7objects16add_to_namespaceERKNS0_3api6objectEPKcS5_'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x1246): undefined reference to `_imp___ZN5boost6python6detail13current_scopeE'
CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):AbsoluteDim.pypp.cpp:(.text+0x1267): undefined reference to `_imp___ZN5boost6python6detail13current_scopeE'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: CMakeFilesPyCEGUI.dir/objects.a(AbsoluteDim.pypp.cpp.obj):
bad reloc address 0x2 in section `.text$_ZN5boost6detail15sp_counted_baseD1Ev[__ZN5boost6detail15sp_counted_baseD1Ev]'
collect2.exe: error: ld returned 1 exit status
ceguisrcScriptModulesPythonbindingsCMakeFilesPyCEGUI.dirbuild.make:6698: recipe for target 'bin/PyCEGUI.pyd' failed
mingw32-make[2]: *** [bin/PyCEGUI.pyd] Error 1
CMakeFilesMakefile2:726: recipe for target 'cegui/src/ScriptModules/Python/bindings/CMakeFiles/PyCEGUI.dir/all' failed
mingw32-make[1]: *** [cegui/src/ScriptModules/Python/bindings/CMakeFiles/PyCEGUI.dir/all] Error 2
Makefile:135: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

我的第一个假设是,它不会链接到boost python,但CMake文件夹中的link.txt显示如下:

"C:\Coding \CMake 2.8\bin\CMake.exe"-E remove-fCMakeFiles\PyCEGUI.dir/objects.a C:\MinGW\bin\ar.exe crCMakeFiles\PyCEGUI.dir/objects.a@CMakeFiles\PyCEGUI.dir \objects1.rspC: \MinGW\bin\g++.exe-共享-o。。。。。。。。。。\bin\PyCEGUI.pyd-Wl,--主映像版本,0,--次映像版本,0-Wl,--whole archive CMakeFiles\PyCEGUI.dir/objects.a-Wl,--no whole archive。。。。。。。。。。\lib\libCEGUIBase-0.dll.aC:\Coding \boost_1_53_0\lib\libboost_python-mgw48-mt-1_53.aC:\Python27\libs\Python27.libC: \编码\CEGUI\CEGUI\依赖项\lib\dynamic\libfreetype.dll.aC: \编码\CEGUI\CEGUI\依赖项\lib\dynamic\libpcre.dll.a-lwinmm-lkernel32-luser32-lgdi32-lwinspool-lshell32-lole32-loleaut32-luuid-lcomdlg32-ladvapi32

所以boost python是针对链接的。我不确定这里可能出了什么问题。促进切圭?MinGW?。。。

事实证明,问题是我使用的是64位版本的Python。我几个月前下载了它,却忘记了这个小事实。

现在,MinGW只能编译和使用32位库,而不能混合使用64位库。这就是导致boost python无法正确编译的原因(奇怪的是它确实编译了),因此在链接时有未定义的引用。

下载32位版本的Python并重新编译boost解决了这些问题。