我正在使用CMAKE构建共享库camera
,它取决于api.so
,它也是共享库。库camera.so
由server
可执行文件使用,我在Linux上。
我在~/projects/server/camera/build
中有CMAKE构建目录。
生产环境中的服务器具有以下结构:
/opt/server
server
api.so
/lib/
camera.so
我有以下CMAKE脚本:
SET(LIB_DIR ${PROJECT_SOURCE_DIR}/lib/Release)
ADD_LIBRARY(api SHARED IMPORTED)
SET_PROPERTY(TARGET api PROPERTY IMPORTED_LOCATION ${LIB_DIR}/api.so)
TARGET_LINK_LIBRARIES(camera
api
)
变量PROJECT_SOURCE_DIR
包含~/projects/server
。
我需要使用IMPORTED_LOCATION
,因为api.so
库名不是以lib
开头,因此我无能为力,它可以正常工作。
我成功构建了camera.so
,然后将其放置在生产服务器上的/opt/server/lib
目录中。当我运行ldd /opt/server/lib/camera.so
时,我可以看到libary正在构建机器上的目录中寻找api.so
,但是我想强制库在运行时向上一级查找它,在../api.so
中也是如此。
我不在乎是使用相对路径还是绝对路径,但是它必须位于我用来在计算机上进行链接的位置之外的其他位置。我不要使用LD_LIBRARY_PATH
,解决方案应该在CMAKE脚本中完成。
我发现到目前为止并尝试过:
SET(CMAKE_INSTALL_RPATH "@executable_path/../")
SET(CMAKE_INSTALL_RPATH "$ORIGIN/../")
但是ldd
仍然告诉我它正在寻找我的构建目录,而该目录在生产中不存在。
您能告诉我使用什么CMAKE命令来解决此问题吗?我在做错什么吗?
答案 0 :(得分:0)
变量CMAKE_INSTALL_RPATH
影响已安装库的RPATH(使用install()
命令)。
要传播内置库的这些设置,请设置CMAKE_BUILD_WITH_INSTALL_RPATH变量:
set(CMAKE_INSTALL_RPATH "$ORIGIN/../")
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
add_library(...)
答案 1 :(得分:0)
我不得不自己寻找一些解决方案,因为距我发布问题已有很长时间了。也许这是一种解决方法,我不知道,我没有找到更好的解决方案,它有效。
Tsyvarev提出的解决方案适用于在同一Cmake项目中构建的库,但不适用于其他人构建的库,这就是我的情况。
我决定在/ usr / lib 中创建具有共享库目录的符号链接,我需要与我的库链接。因此,服务器和构建机器上存在相同的符号链接,但指向库的位置不同。