我正在尝试将boost.python与我在cmake build-system中的应用程序相关联。 我的 CMakeList.txt 中最重要的部分:
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost COMPONENTS filesystem system date_time python REQUIRED)
add_definitions(-Wall -g -msse2 -fPIC)
当然,包括/链接boost和python的库/头文件。
现在失败了:
/usr/bin/ld: libboost_python.a(from_python.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
libboost_python.a: could not read symbols: Bad value
我决定转到cmake临时构建文件夹,找到生成的目标文件(* .o)。 我已经为它申请了命令:
g++ -shared FILE.cpp.o -L/usr/lib -lboost_python -o MyModule.so
因此我为python提供了可行的MyModule模块!所以,让我们看看cmake链接器字符串并找到差异。我用 VERBOSE = 1 :
运行make/usr/bin/c++ -fPIC -g -shared -Wl,-soname,libScript.so -o ../../lib/libScript.so CMakeFiles/LogManagerWrapper.cpp.o -Wl,-Bstatic -lboost_filesystem -lboost_system -lboost_date_time -lboost_python -Wl,-Bdynamic -lpython2.7
在排除链接器标志的某些部分期间,我发现我的问题出现在增强'库列表之前的 -Wl,-Bstatic 中。
我想知道那个论点来自哪里,因为我注意到CMakeList.txt中的 Boost_USE_STATIC_LIBS OFF 。
怎么了?
答案 0 :(得分:0)
您没有显示使用Boost库的代码,因此我假设它只是:
target_link_libraries(foo ${Boost_LIBRARIES})
请你加上
message("XXX ${Boost_LIBRARIES}")
那个点?我怀疑会打印一个扩展名为.a的库列表,然后CMake会将其转换为-Wl,-Bstatic -lxxx
。检查.a库所在的路径,并检查是否存在.so对应项。我的猜测是你实际上只构建了静态库。