CMake 链接 2 个具有相对路径的库

CMake linking 2 libraries with relative path

本文关键字:相对 路径 链接 CMake      更新时间:2023-10-16

我的项目结构:

...
CMakeLists.txt
src/
project/
libA/
CMakeLists.txt
libA.h
libA.cpp
libB/
CMakeLists.txt
libB.h
libB.cpp        
build/

CMakelists.txt

project(project)
# set some global dirs
set(LIB_A_DIR "src/project/libA")
set(LIB_B_DIR "src/project/libB")
# include header directories
include_directories(${LIB_A_DIR})
include_directories(${LIB_B_DIR})
# generating linkable libraries
add_subdirectory(${LIB_A_DIR})
add_subdirectory(${LIB_B_DIR})

src/project/libA/CMakeLists.txt

# define libA sources
set(LIB_A_SOURCES libA.cpp libA.h)
# generate libA library
add_library(libA SHARED ${LIB_A_SOURCES})

src/project/libB/CMakeLists.txt

# define libB sources
set(LIB_B_SOURCES libB.cpp libB.h)
# generate libB library
add_library(libB SHARED ${LIB_B_SOURCES})
# link libraries
target_link_libraries(libB PRIVATE libA)

现在,如果我从 build 文件夹运行cmake .. && make,从libB进行的任何函数调用都可以正常工作。但是一旦我想移动这个文件结构,链接就会断开。

例如,当我cp -r build/ build_copy/并清除build目录时rm -rf build/*任何包含libB的代码都会抛出error while loading shared libraries: liblibB.so: cannot open shared object file: No such file or directory

如何获取使用相对文件路径的链接?

旁注:我需要它们是 2 个独立的共享库和一个链接

您需要将libA运行时路径设置为安装位置。这是通过-rpath链接器选项完成的。

由于链接时将使用C++前端g++clang++,因此需要使用-Wl标志将-rpath选项传递给链接器。

您可以使用set_target_properties命令使用LINK_FLAGS目标属性设置libB标志:

set_target_properties(libB
PROPERTIES LINK_FLAGS "-Wl,-rpath,/path/to/libA/installation")

如在 CMake 中将 2 个库与相对路径注释链接:

为变量分配库的相对路径的绝对路径:

get_filename_component(LIB_A_PATH ../lib/liba.a ABSOLUTE)

然后使用绝对路径链接库(此处为静态(:

add_library( lib_a STATIC IMPORTED )
set_target_properties(lib_a PROPERTIES IMPORTED_LOCATION ${LIB_A_PATH})
target_link_libraries(${PROJECT_NAME} lib_a)