链接器设置

时间:2011-03-11 18:40:44

标签: c++ python boost linker cmake

我正在尝试将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

怎么了?

1 个答案:

答案 0 :(得分:0)

您没有显示使用Boost库的代码,因此我假设它只是:

target_link_libraries(foo ${Boost_LIBRARIES})

请你加上

message("XXX ${Boost_LIBRARIES}")

那个点?我怀疑会打印一个扩展名为.a的库列表,然后CMake会将其转换为-Wl,-Bstatic -lxxx。检查.a库所在的路径,并检查是否存在.so对应项。我的猜测是你实际上只构建了静态库。