我正在使用Boost.Python在C ++中编写Python扩展模块。但是,我
我想使用比系统更新版本的Boost库
安装报价。这个更新版本的boost包含在
BOOST_ROOT=$HOME/opt/boost/1.55.0
。
按照this指南进行操作
在CMake中使用RPath我提出了以下CMakeLists.txt
。
cmake_minimum_required(VERSION 2.8)
project("test")
set(PROJECT_DESC "Test Boost.Python")
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
add_definitions(-std=c++11 -Wall -Wextra -pedantic)
find_package(PythonInterp REQUIRED)
find_package(PythonLibsNew REQUIRED)
find_package(Boost COMPONENTS python REQUIRED)
message(STATUS "Using Boost installation in:")
message(STATUS " INCLUDE: ${Boost_INCLUDE_DIRS}")
message(STATUS " LIB: ${Boost_LIBRARIES}")
include_directories(
${PROJECT_SOURCE_DIR}
${PYTHON_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
)
macro(add_python_module _name _srccpp)
PYTHON_ADD_MODULE(${_name} ${_srccpp})
target_link_libraries(${_name} ${Boost_LIBRARIES})
endmacro()
add_python_module(ownership ownership.cpp)
然后我运行以下命令来构建模块
mkdir build; cd build
cmake -DCMAKE_INSTALL_PATH="$BOOST_ROOT/lib" ..
make
运行cmake
后的状态消息指向正确的提升
安装。 (CMake boost模块选择环境变量
$BOOST_ROOT
)I.e。 CMake变量Boost_LIBARIES
指向
$BOOST_ROOT/lib/libboost_python.so
。
但是,如果我检查实际使用哪些库,那么系统库 列出:
$ ldd ownership.so
# ...
libboost_python.so.1.53.0 => /usr/lib64/libboost_python.so.1.53.0 (0x00007f09abfc1000)
# ...
这是版本1.53,即使上面的状态消息明确指出 到1.55。
我做错了什么?如何让ldd选择库
$BOOST_ROOT/lib/libboost_python.so.1.55.0
?
答案 0 :(得分:1)
首先,正如我已经提到过的,你不需要使用CMake RPATH操作 选项。示例:http://pastebin.com/UDyYbQ1d,输出:standard和custom
你知道一种说服CMake的方法,否则即使设置了LIBRARY_PATH
此问题与CMake及其编译器责任无关。阅读this讨论。
如果明确设置LIBRARY_PATH
变量,则可以清除BOOST_ROOT
。你可以检查一下
CMakeLists.txt
中的环境变量以避免将来出现此问题:
string(COMPARE NOTEQUAL "$ENV{LIBRARY_PATH}" "" library_path_warning)
if(library_path_warning)
message(
WARNING
"LIBRARY_PATH environment variable is not empty ($ENV{LIBRARY_PATH}) "
"This may cause dynamic linking errors!"
)
endif()