- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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 中的标准 bin
、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 -l
和 otool -L
进行 introspec。
注 3:您可以在 GNU/Linux 上使用 ldd lib.so
和 objdump -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/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!