2017-03-09 22 views
0

我对CMake相对较新,我开发了一个小型项目,它构建了一个链接到共享库的库,名为external_library。我CMakeLists.txt文件看起来是这样的:cmake:“make install”不会链接到Ubuntu中的库

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:我在Ubuntu 16.04.2 LTS中使用CMake 3.5.1

+1

你觉得'add_subdirectory(path_to_external_library_header_files subproject/external_library)'做了什么? 'path_to_external_library_header_files'中是否有CMakeLists.txt文件?你为什么试图把外部图书馆作为一部分的工作项目? – kdopen

+0

是的,在'path_to_external_library_header_files'中有'CMakeLists.txt',它将共享库的'.cpp'和'.h'文件添加到项目中。 – GLR

+0

我想让共享库成为创建的库的一部分,这就是为什么我使用'add_subdirectory'(我希望我做的是正确的)。 – GLR

回答

0

我已发现,这个问题可以使用命令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) 
1

共享库在某些路径,在配置寻找/etc/ld.so.conf

如果您的共享库位于其中一个路径中,应该找到它。如果是在这些路径之一不,您有四个选项:

  1. 安装在系统默认路径库(这可能是不希望与实验软件,甚至有可能给您的权限);
  2. 编辑系统范围的搜索路径(不是真的需要触摸系统范围的设置,也许是不可能的,因为权限),
  3. 设置LD_LIBRARY_PATH(不推荐,因为它覆盖系统的搜索路径,这是一个调试功能基本上)或
  4. 设置一个RPATH,即“告诉”/“硬编码”二进制文件在哪里寻找它的库。

会发生什么事是,CMake的自动设置你的二进制文件的RPATH,引用从项目的共享库${CMAKE_BINARY_DIR}建立。 (您想测试对你刚建库,而不是你昨天安装了一个二进制文件。)

默认情况下,这个RPATH设置通过make install清除(所以${CMAKE_BINARY_DIR}库不再被引用,并而是在系统搜索路径中搜索)。

假设您正在安装到系统搜索路径中的目标而不是,那么您的二进制文件现在不再“看到”其共享库。请参考CMake RPATH handling 让CMake将您的二进制文件的RPATH设置为共享库的安装路径。