如何在dylib中创建绝对路径引用?

时间:2014-06-10 16:39:46

标签: macos dylib dyld otool install-name-tool

[免责声明:我正在与其他人的代码合作。我从未创建过.dylib,所以我转向S.O.]

我正在开发一个创建.dylib的发行版。它看起来没问题,但是当我链接它时,生成的可执行文件崩溃了:

dyld: Library not loaded: libstk.dylib.4.4.4
  Referenced from: /Users/r/Projects/Mu/examples/./mune31
  Reason: image not found 
Trace/BPT trap: 5

当我用otool检查可执行文件时,问题很明显:libstk(最后一个条目旁边)有一个相对路径,而不是绝对路径。 (另外,它没有正确设置的兼容性或当前版本。)

Mu[~/Projects/Mu/examples]$ otool -L ./mune31
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
        /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.16.0)
        /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI (compatibility version 1.0.0, current version 73.0.0)
        /Users/r/Projects/Mu/usr/lib/libgsl.0.dylib (compatibility version 18.0.0, current version 18.0.0)
        libstk.dylib.4.4.4 (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)

问题

这个发行版使用g ++(而不是clang)作为编译器。创建.dylib的当前咒语是:

g++  -fPIC -dynamiclib -o libstk.dylib.4.4.4 Release/*.o -lpthread -framework CoreAudio -framework CoreFoundation -framework CoreMidi
install -m 644 libstk.dylib.4.4.4 /Users/r/Projects/Mu/usr/lib

应该阅读什么来创建一个带有绝对路径的.dylib?

更新

出于向后兼容性的原因,我们宁愿在构建时保留dylib的相对名称(即我们不想将-install_name参数传递给g++ -fPIC ...命令)。

在构建具有绝对路径名的dylib之后,有没有办法调整它?当我在现有文件上运行otool -L时,我看到:

$ otool -L libstk.dylib.4.4.4
libstk.dylib.4.4.4:
    libstk.dylib.4.4.4 (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.16.0)
    /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI (compatibility version 1.0.0, current version 73.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)

我希望第一行是

    /MySandbox/whatever/libstk.dylib.4.4.4 (compatibility version 0.0.0, current version 0.0.0)

P.S。

如果有人对我不耐烦,可以使用install_name_tool作为解决方法来更新可执行文件,如下所示:

install_name_tool -change libstk.dylib.4.4.4 ../usr/lib/libstk.dylib.4.4.4 mune31

...但每次构建可执行文件时都不必这样做。

1 个答案:

答案 0 :(得分:3)

在链接可执行文件之前,您可以使用-id的{​​{1}}选项更改dylib的ID。链接器使用ID作为引用可执行文件的库的引用。

如果您希望使用install_name_tool修改二进制文件中的路径,则应指定以下链接器选项之一:install_name_tool-headerpad <size>