首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用CMake正确设置共享库的rpath?

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

Stack Overflow用户
提问于 2022-01-06 09:58:55
回答 2查看 2.2K关注 0票数 0

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

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

我尝试了$ORIGIN, $$ORIGIN, \$ORIGIN,我注意到开始是空字符串。

我做错了什么?

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2022-01-06 10:08:20

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

使用cmake,您可以在这里为target_link_libraries指定一个绝对路径,或者添加一个链接目录,让链接器确定要使用哪个文件。

到lib的路径

代码语言:javascript
运行
复制
# 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")

链接目录

代码语言:javascript
运行
复制
# 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链接到多个目标,那么使用导入的库可能是个好主意,因为它允许您向库中添加包含目录和附加依赖项之类的信息。

代码语言:javascript
运行
复制
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中。

票数 0
EN

Stack Overflow用户

发布于 2022-01-06 10:52:58

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

您不应该做任何特殊的事情,因为CMake将使用build 默认情况下 (在安装过程中被删除,但这不是您已经配置的步骤)。

这就足够了:

代码语言:javascript
运行
复制
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)
代码语言:javascript
运行
复制
cd path/to/project
cmake -B build/Release -DCMAKE_BUILD_TYPE=Release
cmake --build build/Release
./build/Release/rgbd

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

代码语言:javascript
运行
复制
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)
代码语言:javascript
运行
复制
cmake -B build/Release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PWD/package
cmake --build build/Release --target install
./package/bin/rgbd
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70605379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档