我对
CMake
相对较新,我开发了一个小项目,它构建了一个链接到共享库的库,名为external_library
。我的 CMakeLists.txt
文件看起来像这样:
cmake_minimum_required(VERSION 2.8.12)
project(project_name)
include_directories(path_to_external_library_source_code)
add_subdirectory(path_to_external_library_header_files subproject/external_library)
target_link_libraries(project_name external_library)
install(TARGETS project_name DESTINATION installation_path)
当我构建项目时(使用
make
),它工作完美,并且正确创建了链接(我已经使用 ldd
命令检查了它)。但是,当我尝试安装它(使用make install
)时,安装路径中生成的文件未链接到指定的共享库。
再次使用
ldd
,我检查了安装路径中生成的库没有找到共享库,尽管在构建路径中生成的库中找到了共享库。我该如何解决这个问题?
谢谢。
Pd:我在
CMake 3.5.1
中使用 Ubuntu 16.04.2 LTS
。
在某些路径中查找共享库,并在
/etc/ld.so.conf
中进行配置。
如果共享库位于这些路径之一,则应该可以找到它。如果在这些路径之一中不,您有四种选择:
LD_LIBRARY_PATH
(不推荐,因为它会覆盖系统搜索路径,它基本上是一个调试功能),或者
RPATH
,即“告诉”/“硬编码”二进制文件在哪里查找其库。
自动设置二进制文件的 RPATH
,以在
${CMAKE_BINARY_DIR}
中引用共享库 来自项目构建。 (这是完全有道理的,因为您想针对刚刚构建的库测试二进制文件,而不是针对之前安装的库。)默认情况下,此
RPATH
设置由
make install
清除(因此installed 二进制文件不再引用
${CMAKE_BINARY_DIR}
中的库,而是搜索系统搜索路径 - 假设在其中库也已安装)。如果您要安装到的目标位置
不在系统搜索路径中,则您的二进制文件现在不再“看到”其共享库。请参阅 CMake RPATH 处理,让 CMake 将二进制文件的 RPATH 设置为共享库的安装路径。
find_library
解决问题,指定构建的共享库的路径,执行如下操作:
cmake_minimum_required(VERSION 2.8.12)
project(project_name)
include_directories(path_to_external_library_source_code)
find_library(LIBNAME LibName_1 LibName_2 HINTS built_lib_directory)
target_link_libraries(project_name ${LIBNAME})
install(TARGETS project_name DESTINATION installation_path)