Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMAKE RPATH不工作-找不到共享对象文件_Cmake_Makefile - Fatal编程技术网

CMAKE RPATH不工作-找不到共享对象文件

CMAKE RPATH不工作-找不到共享对象文件,cmake,makefile,Cmake,Makefile,每次运行程序时,我都试图摆脱设置LD\u LIBRARY\u PATH。在添加到库中并将我的可执行文件定向到库中之后,当我运行它时,它告诉我它无法打开共享对象库,没有这样的文件或目录 在我的CMakeLists.txt中,我有: add_library(heart SHARED ${HEART_FILES}) add_executable(run ${RUN_FILES}) target_link_libraries(run heart) set(CMAKE_SKIP_BUILD_PATH FA

每次运行程序时,我都试图摆脱设置
LD\u LIBRARY\u PATH
。在添加到库中并将我的可执行文件定向到库中之后,当我运行它时,它告诉我它无法打开共享对象库,没有这样的文件或目录

在我的CMakeLists.txt中,我有:

add_library(heart SHARED ${HEART_FILES})
add_executable(run ${RUN_FILES})
target_link_libraries(run heart)
set(CMAKE_SKIP_BUILD_PATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH "~/person/target/usr/local/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
我设置了一个指向我的库文件夹的绝对链接,以测试这是否会创建指向我的库的rpath,但似乎没有。我已经检查并确保共享库确实在lib中。libheart.so是正在链接的文件。我还遗漏了什么?

这是因为你从同一个cmake项目中构建了心脏和跑步:

CMAKE_INSTALL_RPATH_USE_LINK_PATH是一个有趣且非常有用的选项。使用RPATH构建目标时,CMake通过使用此目标链接到的所有库的目录来确定RPATH。其中一些库可能位于同一生成树中,例如libbar.so,这些目录也会添加到RPATH中。 如果启用此选项,则除生成树中的目录外,所有这些目录都将自动添加到安装路径中。RPATH中可能仍然缺少的唯一目录是同一项目中的库(即libbar.so)安装到的目录。如果库的安装目录不是系统默认库目录之一,则必须通过相应地设置CMAKE_install_RPATH将此目录添加到安装路径中

您可以尝试以下方法:

SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
这里有更多文档

编辑:

只有这样才能起作用:

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

add_library(heart SHARED ${HEART_FILES})
add_executable(run ${RUN_FILES})
target_link_libraries(run heart)

install(
  TARGETS heart run
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
)
清理生成目录,然后:

cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/home/person/target/usr/local ..
make install
在链接CXX可执行文件运行的g++行的末尾,您应该看到-Wl、-rpath、/home/person/target/usr/local/lib

如果您想要一个完全可重新定位的包:

set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")

PS:您确定它是libheart.so吗?在您的CMake文件中,在定义目标之前设置RPATH。调用
add\u executable()
之前,必须定义
CMAKE\u INSTALL\u RPATH
,否则它将无效。

我遇到了与原始帖子类似的问题。我创建了链接到外部共享库的可执行文件。这种方法从构建目录编译并执行得很好。但是,安装到单独目录的可执行文件在运行时找不到共享库:

加载共享库时出错:libxxxx.so.1:无法打开共享对象文件:没有此类文件或目录

为了解决这个问题,我

1) 升级到CMake 3.17

2) 使用Craig Scott推荐的: 设置(CMAKE\u INSTALL\u RPATH$ORIGIN) 正如他在报告中所解释的那样

3) 设置(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)以解决Kitware中第二个常见问题中的此错误

4) 在添加本文中提到的目标之前,请完成所有这些

5) 使用“$ORIGIN/./lib”语法代替了@explo91提到的Craig的Scott提到的$ORIGIN

总之,令我惊讶的是,从上面看,只有目标定义之前的“$ORIGIN/./lib”是必需的(我测试了没有解决
无法打开共享对象文件
运行时问题的其他组合)

无论如何,我最终应用的解决方案可能是更好、细粒度的CMake风格,或者至少可能对其他人的RPATH旅程有所帮助:

set\u target\u属性(在属性安装路径“$ORIGIN/。/lib”上定义目标)

我正在阅读文档,并尝试将其设置为
${CMAKE\u INSTALL\u PERFIX}/lib“
但不起作用。如果
${CMAKE\u INSTALL\u PERFIX}
指向CMakeLists.txt所在的位置,则我确信我有正确的文件路径。
${CMAKE\u INSTALL\u PREFIX}
在使用类似“INSTALL”的CMAKE命令时使用(目标运行目标bin)。您是否有这样的命令,或者您是否尝试从构建树运行程序?我有一个类似于
install(目标运行目标bin)
then
set(CMAKE\u install\u RPATH)${CMAKE\u install\u PREFIX}/lib的命令“
。它仍然说找不到共享库。我的所有可执行文件都安装在../bin文件夹中,我的对象文件都在../lib中。设置变量后,我还将对象安装到lib文件夹中,如下所示:
install(TARGETS heart DESTINATION lib)
。有关解决方案,请参阅。
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
添加可执行文件()之前
添加注意,在某些发行版上可能需要“$ORIGIN/./lib64”。甚至在使用gnuInstallDirs时需要“$ORIGIN/./${CMAKE_INSTALL_LIBDIR}