1

我正在使用 Boost.Python 在 C++ 中编写 Python 扩展模块。但是,我想使用比系统安装提供的更新版本的 Boost 库。这个较新版本的 boost 包含在 BOOST_ROOT=$HOME/opt/boost/1.55.0.

按照这篇关于如何在 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指向正确的 boost 安装。(CMake boost 模块获取环境变量 $BOOST_ROOT)即 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

4

1 回答 1

1

首先,正如我在评论中已经提到的,您不需要使用 CMake RPATH 操作选项。示例: http: //pastebin.com/UDyYbQ1d,输出:标准自定义

即使设置了 LIBRARY_PATH,您是否知道另一种说服 CMake 的方法

这个问题与 CMake 无关,它是编译器的责任。阅读讨论。

解决方案

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()
于 2014-06-08T11:40:01.920 回答