【发布时间】:2020-05-21 13:01:29
【问题描述】:
我的项目配置是这样的:
proj/main.c
proj/myinc.h
我的程序使用外部库,由我手动添加:
proj/include/inc1.in
proj/include/inc2.in
和
proj/lib/lib1.so
proj/lib/lib2.so.1
我将它们添加到我的 CMake 文件中:
add_library(lib1 SHARED IMPORTED)
add_library(lib2 SHARED IMPORTED)
set_property(TARGET lib1 PROPERTY IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/lib/lib1.so")
set_property(TARGET lib2 PROPERTY IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/lib/lib2.so.1")
并链接它:
target_link_libraries(${PROJECT_NAME} lib1 lib2)
另外,我必须将这两个库复制到/usr/bin 以便稍后运行我的可执行文件。
install(FILES ${PROJECT_SOURCE_DIR}/lib/lib1.so DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
install(FILES ${PROJECT_SOURCE_DIR}/lib/lib2.so.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
然后我使用:cmake . && make && sudo make install
然后我删除 proj/lib 目录。
但是当我运行我构建的文件时,它会在 proj/lib/ 中请求库,但在 /usr/lib 中却没有:
$ /usr/bin/app
app: error while loading shared libraries: lib/lib1.so: cannot open shared object file: No such file or directory
问题:如何让我构建的应用使用来自 /usr/lib 的共享库? 谢谢
【问题讨论】:
-
欢迎来到 Stack Overflow!也许,这是一个 RPATH 问题?考虑阅读this。
-
我不太清楚。我添加了 set(CMAKE_INSTALL_RPATH "/usr/lib") 和 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)。但仍然在 proj/lib 中搜索 *.so
-
你怎么知道它在
proj/lib中的样子?错误信息显示lib/lib1.so,这是一个相对路径,可以对应either路径。 -
如果我删除 proj/lib 文件夹,程序会抛出该错误。那么我如何设置我构建的应用程序来搜索 /usr/lib 中的库(不在 proj/lib 中)
-
另外,
CMAKE_INSTALL_PREFIX的值是多少?你改了吗?这默认为/usr/local,这表明您的库将安装到/usr/local/lib目录...