【问题标题】:CMake: Linking shared lib with other libs with relative path for distributionCMake:将共享库与具有相对路径的其他库链接以进行分发
【发布时间】:2019-05-03 11:58:46
【问题描述】:

上下文:我正在开发一个共享库以...嗯...与其他用户共享。我的库依赖于许多其他库,这迫使我也共享所有这些依赖项。我想使用 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 一起使用。

【问题讨论】:

    标签: cmake linker relative-path


    【解决方案1】:

    我做了更多的测试,实际上,SET (CMAKE_SHARED_LINKER_FLAGS "-Wl,-rpath,$ORIGIN/libs") 的使用解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 2015-08-06
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多