CMake:将共享库与具有相对分发路径的其他库链接起来
CMake: Linking shared lib with other libs with relative path for distribution
Context:我正在开发一个共享库来......好吧......与其他用户共享。我的库依赖于许多其他库,这迫使我也共享所有这些依赖项。我想使用 CMake 构建这个库。
问题:因为我的lib用户肯定会把它重定位到和我的不一样的目录树,所以我的lib必须使用相对路径搜索它的依赖。我的意思是总是,或者至少也在 ./libs
目录中搜索。
问题:如何修改我的 CMakeLists.txt
以完成此任务?
我的项目树:
myproject/
|---- CMakeLists.txt
|---- build/
|---- libs/
|---- libdep1.so.1.2
|---- libdep2.so.2.1
|---- libdep3.so.0.6
|---- src/
|---- file0.cpp
|---- file1.cpp
|---- file1.hpp
|---- file2.cpp
|---- file2.hpp
- build 是我将
cd/build
调用 cmake ..
和 make
. 的目录
- libs 是我将复制所有依赖项(其他库)以与我的库共享的目录。
- src 是我所有的 cpp 和 hpp 文件所在的目录。
我的CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
project(myproject)
SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_VERBOSE_MAKEFILE ON)
add_definitions(-std=c++11 -fPIC -m64)
SET (THIRD_PARTY_INCLUDE_ONE /home/3rdparty/xpto/include/)
SET (THIRD_PARTY_INCLUDE_TWO /home/3rdparty/ypto/include/)
include_directories(${THIRD_PARTY_INCLUDE_ONE} ${THIRD_PARTY_INCLUDE_TWO})
add_library(
mysharedlib SHARED
${CMAKE_SOURCE_DIR}/src/file0.cpp
${CMAKE_SOURCE_DIR}/src/file1.cpp
${CMAKE_SOURCE_DIR}/src/file2.cpp)
SET (DEP_LIBS ${CMAKE_SOURCE_DIR}/libs)
target_link_libraries(
mysharedlib
${DEP_LIBS}/libdep1.so.1.1
${DEP_LIBS}/libdep2.so.2.1
${DEP_LIBS}/libdep3.so.0.6)
编辑 1:
我尝试在add_library(...)
之前使用SET (CMAKE_SHARED_LINKER_FLAGS "-Wl,-rpath,$ORIGIN/libs")
,但似乎没有效果。我认为这可能是因为我正在使用 ${DEP_LIBS}/
链接依赖项,但是如果我删除它,它就找不到库了,还会导致错误,说我应该使用 -fPIC
重新编译依赖项.我确信这是一个副作用,因为这些库都是共享库 (libnameofthelib.so
) 并且它可以在没有这个新标志的情况下与 CMakeFile.txt
一起使用。
我做了更多的测试,实际上,使用 SET (CMAKE_SHARED_LINKER_FLAGS "-Wl,-rpath,$ORIGIN/libs")
解决了问题。
Context:我正在开发一个共享库来......好吧......与其他用户共享。我的库依赖于许多其他库,这迫使我也共享所有这些依赖项。我想使用 CMake 构建这个库。
问题:因为我的lib用户肯定会把它重定位到和我的不一样的目录树,所以我的lib必须使用相对路径搜索它的依赖。我的意思是总是,或者至少也在 ./libs
目录中搜索。
问题:如何修改我的 CMakeLists.txt
以完成此任务?
我的项目树:
myproject/
|---- CMakeLists.txt
|---- build/
|---- libs/
|---- libdep1.so.1.2
|---- libdep2.so.2.1
|---- libdep3.so.0.6
|---- src/
|---- file0.cpp
|---- file1.cpp
|---- file1.hpp
|---- file2.cpp
|---- file2.hpp
- build 是我将
cd/build
调用cmake ..
和make
. 的目录
- libs 是我将复制所有依赖项(其他库)以与我的库共享的目录。
- src 是我所有的 cpp 和 hpp 文件所在的目录。
我的CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
project(myproject)
SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_VERBOSE_MAKEFILE ON)
add_definitions(-std=c++11 -fPIC -m64)
SET (THIRD_PARTY_INCLUDE_ONE /home/3rdparty/xpto/include/)
SET (THIRD_PARTY_INCLUDE_TWO /home/3rdparty/ypto/include/)
include_directories(${THIRD_PARTY_INCLUDE_ONE} ${THIRD_PARTY_INCLUDE_TWO})
add_library(
mysharedlib SHARED
${CMAKE_SOURCE_DIR}/src/file0.cpp
${CMAKE_SOURCE_DIR}/src/file1.cpp
${CMAKE_SOURCE_DIR}/src/file2.cpp)
SET (DEP_LIBS ${CMAKE_SOURCE_DIR}/libs)
target_link_libraries(
mysharedlib
${DEP_LIBS}/libdep1.so.1.1
${DEP_LIBS}/libdep2.so.2.1
${DEP_LIBS}/libdep3.so.0.6)
编辑 1:
我尝试在add_library(...)
之前使用SET (CMAKE_SHARED_LINKER_FLAGS "-Wl,-rpath,$ORIGIN/libs")
,但似乎没有效果。我认为这可能是因为我正在使用 ${DEP_LIBS}/
链接依赖项,但是如果我删除它,它就找不到库了,还会导致错误,说我应该使用 -fPIC
重新编译依赖项.我确信这是一个副作用,因为这些库都是共享库 (libnameofthelib.so
) 并且它可以在没有这个新标志的情况下与 CMakeFile.txt
一起使用。
我做了更多的测试,实际上,使用 SET (CMAKE_SHARED_LINKER_FLAGS "-Wl,-rpath,$ORIGIN/libs")
解决了问题。