我的项目结构:
...
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个单独的共享库并结合链接
答案 0 :(得分:0)
您需要将{{1>}的运行时路径设置为安装位置。这是通过libA
链接器选项完成的。
由于链接时将使用C ++前端-rpath
或g++
,因此需要使用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)