链接器设置
我正在尝试在cmake构建系统中将boost.python与我的应用程序连接起来。我的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
结果我得到了一个可以用的MyModule模块,可以在python中使用!接下来,我们来看看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这个参数,它在boost库列表之前。
我很好奇这个参数是从哪里来的,因为我在CMakeList.txt中注意到Boost_USE_STATIC_LIBS OFF。
这到底是怎么回事呢?
1 个回答
0
你没有展示使用Boost库的代码,所以我猜它可能就是:
target_link_libraries(foo ${Boost_LIBRARIES})
你能在那个地方加上
message("XXX ${Boost_LIBRARIES}")
吗?我怀疑这样做会打印出一份以.a结尾的库的列表,然后CMake会把它转换成 -Wl,-Bstatic -lxxx
。检查一下.a库所在的路径,看看是否有对应的.so库。我猜你实际上只有静态库被构建出来。