CMake链接2个库与相对路径

时间:2018-05-05 14:00:46

标签: c++ cmake

我的项目结构:

...
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 /项目/ 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 /项目/ 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)

现在,如果我从构建文件夹运行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个单独的共享库并结合链接

2 个答案:

答案 0 :(得分:0)

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

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

您可以使用LINK_FLAGS命令为-rpath的{​​{3}}目标属性设置标记:

libB

答案 1 :(得分:0)

CMake linking 2 libraries with relative path注释:

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

group by

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

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