【问题标题】:cmake link to shared libraries without using full pathcmake 链接到共享库而不使用完整路径
【发布时间】:2014-07-25 15:13:47
【问题描述】:

我有以下 CMakeLists.txt:

set( PROJECT_LINK_LIBS lib1.so lib2.so )
link_directories( path/to/libs ) # lib1.so and lib2.so are there.

add_library( ${PROJECT_NAME} SHARED ${PROJECT_SOURCES} )
target_link_libraries( ${PROJECT_NAME} ${PROJECT_LINK_LIBS} )

编译和链接都很好。

但是当我这样做时:

ldd -d mylib.so

我明白了:

  1. libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf529b000)
  2. linux-gate.so.1 => (0xf777a000)
  3. /lib/ld-linux.so.2 (0xf777b000)
  4. lib1.so => /path/to/libs/lib1.so (0xf56a2000)
  5. lib2.so => /path/to/libs/lib2.so (0xf548f000)

我的问题是:

  • 如何为 4. 和 5. 删除 /path/to/libs/? 与 LD_LIBRARY_PATH 有什么关系?
  • 自动回答: 我明白什么意思 1. 在该路径中搜索 libc.so.6。但是 2. 和 3. 呢? locate linux-gate.so.1 什么也没给。为什么 3. 没有 => 符号? (找到答案here

【问题讨论】:

    标签: c++ linux linker cmake


    【解决方案1】:

    好的,找到答案了:

    set( CMAKE_SKIP_BUILD_RPATH true )
    

    做到了。

    【讨论】:

      【解决方案2】:

      您有实际问题还是只是对ldd 的输出感到困惑?回答您的问题:如果您在 Linux 上成功编译和链接库,则将存储外部库的完整路径。如果您现在复制或安装(使用 CMake)您的库,则完整的库路径将被删除。现在,您必须确保 LD_LIBRARY_PATH 提供了正确的路径,或者外部库位于您的库所在的同一文件夹中。

      【讨论】:

      • 问题是如何删除硬编码的 /path/to/libs/ 并只留下 lib1.so/lib2.so 以使用 LD_LIBRARY_PATH 进行搜索。看看我的答案,解决它。现在,如何使用 CMake 复制库?
      • @Borzh 我只是觉得你所看到的并不是真正的问题。你还是对的。您回答的内容将从一开始就删除 rpath 条目。如果您想使用 CMake 复制您的库,请使用 FILE COPYINSTALL
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2017-05-29
      • 2011-11-06
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多