cmake:“make install”没有链接到Ubuntu中的库

时间:2017-03-09 12:49:02

标签: ubuntu cmake gnu-make

我对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

2 个答案:

答案 0 :(得分:1)

/etc/ld.so.conf

中配置的某些路径中查找共享库

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

  1. 库安装在系统默认路径中(实验软件可能不需要,或者甚至可能根据您的权限);
  2. 编辑系统范围的搜索路径(不太适合触摸系统范围的设置,并且由于权限可能无法实现),
  3. 设置LD_LIBRARY_PATH(不推荐,因为它会覆盖系统搜索路径,它基本上是一个调试功能),或者
  4. 设置RPATH,即"告诉" /"硬编码"二进制文件在哪里寻找它的库。
  5. CMake 自动设置二进制文件的RPATH,以便在${CMAKE_BINARY_DIR}中引用项目构建中的共享库。 (您希望针对刚刚构建的库测试二进制文件,而不是昨天安装的库。)

    默认情况下,此make install 设置清除(因此不再引用${CMAKE_BINARY_DIR}中的库,而是在系统搜索路径中搜索)。

    假设您正在安装到系统搜索路径中的目标位置,您的二进制文件现在不再是"看到"它的共享库。咨询CMake RPATH handling  让CMake将二进制文件的RPATH设置为共享库的安装路径。

答案 1 :(得分: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)