如何在运行时将OpenNI (libOpenNI2.so)链接到我的C++程序?这问题/答案与我的问题最相关。我遵循它并准备了下面的CMakeLists.txt,但是它仍然不能链接.so文件并生成一个错误/usr/bin/ld: cannot find -lOpenNI2
我使用cmake .. && cmake --build . --config Release
来编译程序。
我尝试了$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)
发布于 2022-01-06 10:08:20
rpath是仅在运行时用于查找库的信息。链接器将不会使用它来确定要链接的库的位置。
使用cmake,您可以在这里为target_link_libraries
指定一个绝对路径,或者添加一个链接目录,让链接器确定要使用哪个文件。
到lib的路径
# 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链接到多个目标,那么使用导入的库可能是个好主意,因为它允许您向库中添加包含目录和附加依赖项之类的信息。
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中。
发布于 2022-01-06 10:52:58
您得到的错误不是在运行时,而是在链接时。由于没有为链接器提供任何搜索路径,ld无法找到指定的libOpenNI2.so
。
您不应该做任何特殊的事情,因为CMake将使用build 默认情况下 (在安装过程中被删除,但这不是您已经配置的步骤)。
这就足够了:
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
现在,如果您要发布您的可执行文件,请考虑添加一个正确的安装步骤,安装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
https://stackoverflow.com/questions/70605379
复制相似问题