使用cmake链接共享库而不必使用完整路径

5

我有以下的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)
2个回答

4

好的,我找到了答案:

set( CMAKE_SKIP_BUILD_RPATH true )

搞定了。


-1

你是真的遇到问题了还是只是被 ldd 的输出搞糊涂了?回答你的问题:如果你在Linux上成功编译和链接库,外部库的完整路径将会被存储。现在,如果你复制或安装(使用CMake)你的库,完整的库路径将会被去掉。现在,你需要确保正确的路径由 LD_LIBRARY_PATH 提供或者外部库与你的库位于同一文件夹中。


1
问题是如何删除硬编码的 /path/to/libs/,只留下 lib1.so/lib2.so 以使用 LD_LIBRARY_PATH 进行搜索。请查看我的答案,它可以解决这个问题。现在,如何使用 CMake 复制库? - Borzh
2
@Borzh 我只是有一种感觉,你看到的不是一个实际的问题。但你是对的。你所回答的将会从开头删除rpath条目。如果你想使用CMake复制你的库,请使用FILE COPYINSTALL - ToniBig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接