繁体   English   中英

如何使用 CMake 正确设置共享库的 rpath?

[英]How to correctly set rpath to shared library with CMake?

如何在运行时将 OpenNI (libOpenNI2.so) 链接到我的 C++ 程序? 这个问题/答案与我的问题最相关。 我跟着它准备了以下CMakeLists.txt,但它仍然无法链接.so文件并生成错误/usr/bin/ld: cannot find -lOpenNI2

我使用cmake.. && cmake --build. --config Release cmake.. && cmake --build. --config Release编译程序。

我试过$ORIGIN, $$ORIGIN, \$ORIGIN并且我注意到 ORIGIN 是空字符串。

我究竟做错了什么?

cmake_minimum_required(VERSION 3.1)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

project(rgbd)# project name

# to link OpenNI2 at runtime
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
SET(CMAKE_INSTALL_RPATH "")

add_executable(rgbd rgbd.cpp)

message(STATUS ${ORIGIN})# display ORIGIN

set_target_properties(rgbd PROPERTIES LINK_FLAGS "-Wl,-rpath,$ORIGIN/../OpenNI-Linux-x64-2.3.0.66/Redist")

target_link_libraries(rgbd libOpenNI2.so)

rpath 是仅在运行时用于查找库的信息。 linker 不会使用它来确定要链接的库的位置。

使用 cmake 您可以在此处指定target_link_libraries的绝对路径或添加链接目录并让 linker 确定要使用的文件。

库路径

# not sure if this is the exact path; you may need to do some adjustments
target_link_libraries(rgbd "${CMAKE_CURRENT_SOURCE_DIR}/../OpenNI-Linux-x64-2.3.0.66/Redist/libOpenNI2.so")

链接目录

# again not sure, if the path is correct here
target_link_directories(rgdb PRIVATE ../OpenNI-Linux-x64-2.3.0.66/Redist)
target_link_libraries(rgbd PRIVATE OpenNI2)

如果您将 lib 链接到多个目标,使用导入的库可能是一个好主意,因为它允许您向 lib 添加包含目录和其他依赖项等信息。

add_library(OpenNI2_import SHARED IMPORTED GLOBAL)
set_target_properties(OpenNI2_import PROPERTIES
    IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../OpenNI-Linux-x64-2.3.0.66/Redist/libOpenNI2.so"
)

# include directories could be added
target_include_directories(OpenNI2_import INTERFACE
    "${CMAKE_CURRENT_SOURCE_DIR}/../OpenNI-Linux-x64-2.3.0.66/include" # probably not the correct path; use absolute paths here
)

# could add dependencies, if necessary
target_link_libraries(OpenNI2_import INTERFACE some_other_lib)

...

target_link_libraries(rgbd PRIVATE OpenNI2_import)

您可能仍需要调整 rpath,但使用\$ORIGIN/...应该可以让“cmake”将$ORIGIN/...放入生成的二进制文件的 rpath 中。

您得到的错误不是在运行时而是在链接时 ld找不到指定的libOpenNI2.so ,因为您没有提供任何 linker 的搜索路径。


您不必做任何特别的事情,因为 CMake 默认将使用 build rpath(在安装过程中会被删除,但这不是您配置的步骤)。

这应该足够了:

cmake_minimum_required(VERSION 3.13)
project(rgbd)

add_executable(${PROJECT_NAME} rgbd.cpp)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_11)
target_link_directories(${PROJECT_NAME} PRIVATE ../OpenNI-Linux-x64-2.3.0.66/Redist)
target_link_libraries(${PROJECT_NAME} PRIVATE OpenNI2)
cd path/to/project
cmake -B build/Release -DCMAKE_BUILD_TYPE=Release
cmake --build build/Release
./build/Release/rgbd

现在,如果您要发布可执行文件,请考虑添加正确的安装步骤并处理 install rpath:

cmake_policy(SET CMP0095 OLD) //CMake>=3.16 handles $ORIGIN escaping differently
set_target_properties(${PROJECT_NAME}
    PROPERTIES
        INSTALL_RPATH "\\\$ORIGIN/../lib"
)

include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME})
install(FILES ../OpenNI-Linux-x64-2.3.0.66/Redist/libOpenNI2.so TYPE LIB)
cmake -B build/Release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PWD/package
cmake --build build/Release --target install
./package/bin/rgbd

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM