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

问题描述 投票:0回答:2

我对

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

ubuntu cmake gnu-make
2个回答
9
投票

在某些路径中查找共享库,并在

/etc/ld.so.conf
中进行配置。

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

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

自动设置二进制文件的 RPATH

,以在 
${CMAKE_BINARY_DIR} 中引用共享库 来自项目构建
。 (这是完全有道理的,因为您想针对刚刚构建的库测试二进制文件,而不是针对之前安装的库。)

默认情况下,此

RPATH

 设置由 
make install 清除
(因此 
installed 二进制文件不再引用 ${CMAKE_BINARY_DIR}
 中的库,而是搜索系统搜索路径 - 假设在其中库也已安装)。

如果您要安装到的目标位置

不在系统搜索路径中,则您的二进制文件现在不再“看到”其共享库。请参阅 CMake RPATH 处理,让 CMake 将二进制文件的 RPATH 设置为共享库的安装路径。


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)

	
© www.soinside.com 2019 - 2024. All rights reserved.