【问题标题】:Why are shared libraries linked with absolute paths on OS X?为什么共享库与 OS X 上的绝对路径链接?
【发布时间】:2015-01-09 04:16:40
【问题描述】:

所以我正在将游戏从 Linux 移植到 OS X 并成功编译和链接它,但现在我在启动它时遇到了问题 - 动态链接器找不到库。

这是otool -L 的输出:

./foo:
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
        @rpath/SDL2.framework/Versions/A/SDL2 (compatibility version 1.0.0, current version 3.1.0)
        /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
        /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 59.0.0)
        /usr/lib/libGLEW.1.10.0.dylib (compatibility version 1.10.0, current version 1.10.0)
        /usr/lib/libtheoradec.1.dylib (compatibility version 3.0.0, current version 3.4.0)
        /usr/lib/libtheora.0.dylib (compatibility version 4.0.0, current version 4.10.0)
        /usr/local/lib/libvorbis.0.dylib (compatibility version 5.0.0, current version 5.7.0)
        /usr/local/lib/libogg.0.dylib (compatibility version 9.0.0, current version 9.2.0)
        @loader_path/libsteam_api.dylib (compatibility version 1.0.0, current version 1.0.0)
        /Users/macosx/some/path/to/code/openal-soft-1.16.0/build/libopenal.1.dylib (compatibility version 1.0.0, current version 1.16.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)

问题是,其中一些路径是完全错误的。例如,/usr/… 中既不存在 GLEW 也不存在 Ogg/Vorbis/Theora,并且无论出于何种原因,通往 OpenAL Soft 的路径都被刻录为绝对路径。

不过,通过正确设置DYLD_LIBRARY_PATH,我可以开始游戏。但是,出于多种原因,我不希望将系统的绝对路径嵌入到二进制文件中。

这里发生了什么?有没有办法在我选择的库上强制使用相对路径(我想这就是 @loader_path 的东西?)?有没有关于此事的文件?

【问题讨论】:

  • 是的,这很复杂,但在链接过程中,绝对路径嵌入在可执行文件中。不属于系统的 Dylib 必须移动到应用程序包的 Frameworks 文件夹中,install_name 用于更改它们在可执行文件中的路径。网上有很多关于如何做到这一点的文章。
  • 好的,所以如果我搜索“安装名称”,我应该能够找到相关文档,对吧?
  • 我不这么认为,不。该工具名为install_name
  • 谢谢,这行得通! install_name_tool -change <from> <to> <executable> 成功了。

标签: macos shared-libraries ld dynamic-linking dyld


【解决方案1】:

正如@trojanfoe 建议的那样——这很有效:

install_name_tool -change <from> <to> <executable>

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 2011-04-28
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2011-11-06
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多