如何为boost.Python使用CMake RPath 我使用PoST.python编写C++中的Python扩展模块。然而,我 是否希望使用比系统更新的Boost库版本 安装优惠。更新版本的boost包含在 BOOST\u ROOT=$HOME/opt/BOOST/1.55.0

如何为boost.Python使用CMake RPath 我使用PoST.python编写C++中的Python扩展模块。然而,我 是否希望使用比系统更新的Boost库版本 安装优惠。更新版本的boost包含在 BOOST\u ROOT=$HOME/opt/BOOST/1.55.0,boost,cmake,rpath,Boost,Cmake,Rpath,以下指南介绍如何 为了在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_PA

以下指南介绍如何 为了在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_ROOT
),即CMake变量
BOOST_LIBARIES
指向
$BOOST\u ROOT/lib/libboost\u 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\u ROOT/lib/libboost\u python.so.1.55.0

首先,正如我在Commons中已经提到的,您不需要使用CMake RPATH操作 选项。示例:,输出:和

即使设置了库路径,您是否知道如何说服CMake

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

解决方案 如果显式设置
BOOST\u ROOT
变量,则可以清除
LIBRARY\u PATH
。你可以查一下
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()

遵循本指南,了解如何在CMake中使用RPath
AFAIK,在您的情况下不需要这样做。如果要在项目中构建具有依赖项的共享库,则需要CMAKE_SKIP_BUILD_RPATH选项。例如,您构建共享库
Foo
,这取决于共享库
Boo
。因此,在构建
ldd Foo
时,将显示
build dir/Boo.So
,在安装时,您需要更改它:
ldd Foo
将显示
install/path/Boo.So
。您链接的所有库都是项目的外部库,因此ldd将始终输出安装路径。
PYTHON\u ADD\u MODULE
命令是否将库添加到链接?可能这些库依赖于
/usr/lib64/libboost_python。所以
我不确定我是否理解你的意思。
只需重新编写你提供的wiki链接:
如果程序链接到同样在同一项目中构建的共享库,然后,当从生成树运行可执行文件时,RPATH需要指向生成树中的目录,并且一旦安装了可执行文件,它就不能再指向生成树。
因此,基本上,如何让cmake让我的共享对象引用正确版本的boost python?
与RPATH无关(至少不需要手动修改)。使用
cmake\u VERBOSE\u MAKEFILE=ON
生成cmake项目,并显示链接器选项我尝试过的微小项目:。结果:和。正如您所见,没有必要使用CMAKE\u SKIP\u BUILD\u RPATH或其他什么。谢谢您的回答。很可能是真的,简单地清除
LIBARARY\u路径
是最干净的解决方案。然而,不幸的是,我使用LIBRARY_PATH做了一些其他事情,现在不想更改这些。我找到了一种方法来检查boost或python库路径是否包含在
library\u path
中。你可以找到代码。