[免责声明:我正在使用其他人的代码。我从来没有创建过 .dylib,所以我转向 SO]
我正在开发一个创建 .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)
ps
如果有人像我一样不耐烦,您可以使用install_name_tool
一种解决方法来更新可执行文件,如下所示:
install_name_tool -change libstk.dylib.4.4.4 ../usr/lib/libstk.dylib.4.4.4 mune31
...但是每次构建可执行文件时不必这样做肯定会很好。