【问题标题】:cmake: "make install" does not link against libraries in Ubuntucmake:“make install”不链接到 Ubuntu 中的库
【发布时间】:2017-07-30 11:13:07
【问题描述】:

我对@9​​87654321@ 比较陌生,我开发了一个小项目,该项目构建了一个链接到共享库的库,名为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:我在Ubuntu 16.04.2 LTS 中使用CMake 3.5.1

【问题讨论】:

  • 您认为add_subdirectory(path_to_external_library_header_files subproject/external_library) 会做什么? path_to_external_library_header_files 中是否有 CMakeLists.txt 文件?你为什么要把外部库作为你项目的一部分?
  • 是的,path_to_external_library_header_files 中有一个CMakeLists.txt,它将共享库的.cpp.h 文件添加到项目中。
  • 我希望共享库成为创建库的一部分,这就是我使用add_subdirectory 的原因(我希望我做得对)。

标签: ubuntu cmake gnu-make


【解决方案1】:

/etc/ld.so.conf中配置的特定路径中查找共享库。

如果您的共享库位于这些路径之一,则应该可以找到它。如果它在这些路径之一中不是,您有四种选择:

  1. 将库安装在系统默认路径中(这对于实验性软件来说可能是不可取的,甚至可能在您的权限下);
  2. 编辑系统范围的搜索路径(实际上不希望触摸系统范围的设置,并且可能由于权限而无法实现),
  3. 设置LD_LIBRARY_PATH(不推荐,因为它会覆盖系统搜索路径,它基本上是一个调试功能),或者
  4. 设置 RPATH,即“告诉”/“硬编码”二进制文件在哪里查找其库。

发生的情况是 CMake 自动 设置您的二进制文件的 RPATH,以引用 ${CMAKE_BINARY_DIR} 中的共享库来自您的项目构建。 (您想针对您刚刚构建的库而不是您昨天安装的库来测试二进制文件。)

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 2014-06-30
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多