如何使用CMake RPath进行boost.Python

时间:2014-06-07 11:59:55

标签: boost cmake rpath

我正在使用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

1 个答案:

答案 0 :(得分:1)

首先,正如我已经提到过的,你不需要使用CMake RPATH操作 选项。示例:http://pastebin.com/UDyYbQ1d,输出:standardcustom

  

你知道一种说服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()