【问题标题】:CMake how to remove the default /usr/lib path when linking a shared library?CMake如何在链接共享库时删除默认的/usr/lib 路径?
【发布时间】:2018-03-09 22:31:48
【问题描述】:

这是 otool -L libtarget.dylib 的当前输出

libA.dylib
libB.dylib
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)

我能够删除 libc++.dylib 依赖,但我不知道如何删除 libSystem.dylib

在 CMake 中链接到共享库时,有没有办法删除默认的 /usr/lib 路径?

【问题讨论】:

  • 我不明白你的问题。如果您向我们展示您如何链接到这些库,将会有所帮助。尝试创建一个重现您的问题的最小示例,然后发布您的CMakeLists.txt。这样我们就可以清楚地看到您正在尝试做什么。
  • 在我的 CMakeLists.txt 中,我执行类似于以下内容的操作:target_link_libraries(target A) target_link_libraries(target libB) 该库当前构建正确。但是,我要做的是删除对libc++.dyliblibSystem.dylib 的依赖。如果您有任何建议,请告诉我@thomas_f
  • @Alpha234 你的意思是你想摆脱硬编码的路径吗?如果您的可执行文件链接到标准 C++ 库,这可能意味着它依赖于它,因此不可能“摆脱它”?
  • @Nibor 我对 CMake 很陌生,但我认为它不是硬编码路径,因为我能够删除 libc++.dylib 依赖项。我正在构建的 lib 不能具有标准的 lib 依赖项,否则将无法正确加载。我相信链接到 libSystem.dylib 只是 CMake 中的默认设置,我想知道如何删除该依赖项。
  • 只是出于好奇:你是如何“移除”依赖的?

标签: c++11 cmake dynamic-linking c++-standard-library


【解决方案1】:

这会很困难,即使是最简单的 C 示例也链接到 libSystem.B 例如,如果你执行

echo "int main() { return 0; }" | gcc -xc -

紧随其后

otool -L a.out 

它会显示你对libSystem.B的依赖

a.out:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)

另一种方法是使用rpath

install_name_tool -change /usr/lib/libSystem.B.dylib @rpath/libSystem.B.dylib a.out

【讨论】:

  • 感谢您的回复,但我的目标是完全避免将libSystem.dylib 链接到我的共享库,而不是更改libSystem.dylib 的路径。我一直试图通过添加-nostdlib 标志来修改CMAKE_SHARED_LINKER_FLAGS 来解决这个问题,但到目前为止还没有成功。 @Nibor
  • 答案的要点是表明,即使是一个不使用任何标准库设施的微不足道的例子也对它有依赖性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多