linux - CMake 安装到 bin/lib 但应用找不到 lib

标签 linux cmake installation

我正在使用 cmake 构建一个多二进制项目并在 Debian 中进行部署。 CMakeLists.txt 简化为如下内容:

add_library(mylib SHARED lib.cpp)  #creates libmylib.so
add_executable(myapp main.cpp)
target_link_libraries(myapp my-lib)

install(TARGETS mylib myapp
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
       )

如果我将它安装到 (-DCMAKE_INSTALL_PREFIX=/usr) 那么我就没有问题。但是,如果我安装到其他地方(-DCMAKE_INSTALL_PREFIX=/opt/myapp,甚至 -DCMAKE_INSTALL_PREFIX=/usr/local),那么我就会遇到问题。

当我运行 $/opt/myapp/bin/myapp 时,我的应用程序找不到 .so。

我可以使用 myapp 部署一个脚本来设置:

#!/bin/sh
export LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib:$LD_LIBRARY_PATH
exec ${CMAKE_INSTALL_PREFIX}/bin/myapp $*

但这感觉像是一个 hack。另外,需要在配置时使用 ${CMAKE_INSTALL_PREFIX}/lib 生成脚本。

我想有一种更原生的方式来处理这个问题,它让我可以在安装后从 /opt/usr/local 简单地执行我的应用程序。它最好在配置、编译或安装时而不是在运行时之前处理这个问题,并且最好不需要有人修改他们的 ~/.bashrc~/.profile

你能告诉我是否有一些方法可以将 linux 中的标准 binlib 结构部署到任意路径而不需要运行前脚本?

最佳答案

你应该:

  • 使用 rpath (Unix) 或 loader_path (MacOS)
  • 或将其安装在常规系统路径中(/usr/lib 或/usr/local/lib 等...)
  • 或使用 LD_LIBRARY_PATH

设置 RPATH 的示例:

if(APPLE)
  set(CMAKE_INSTALL_RPATH "@loader_path/../lib;@loader_path")
elseif(UNIX)
  set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib:$ORIGIN/")
endif()

注意:在 macOS 上你现在应该使用@rpath
注 2:在 macOS 上,您可以使用 otool -lotool -L 进行 introspec。
注 3:您可以在 GNU/Linux 上使用 ldd lib.soobjdump -p lib.so

注意:最好使用GNUInstallDirs

include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME}
  INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

关于linux - CMake 安装到 bin/lib 但应用找不到 lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48419185/

相关文章:

linux - 如何在 Shell 中使用 CURL 在支持 CSRF 的网站上通过 https 上传文件?

c++ - Qt 5 和 OS X Mavericks 问题

c++ - 为什么 CMake 从 g++ 命令行跳过 -I 标志

c++ - 如何在Dev C++中使用Eigen库?

php - pear 不承认是内部还是外部?问题

linux - 什么是最好的开源、兼容 linux 的 UML 建模工具?

c - 内核模块中的静态函数原型(prototype)

java - 如何使用 ProcessBuilder 运行和终止异步重定向

c++ - CPack NSIS 组件未指定

python - 如何安装支持 Swig 的 Python 扩展 (QuickFix)