[英]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.