如果我理解正确,您希望链接来自过时系统框架的代码。
静态链接意味着您必须将 dylib 拆开并从中创建一个静态库,这至少很难说。
但是您可以将受影响的系统框架从旧的(有缺陷的)系统复制到您的应用程序包装器或靠近可执行文件的其他位置。然后将可执行文件链接到这些框架。
您可以使用终端查看您正在链接的库:
$ cd foo-project/build/Debug
$ otool -L foo
foo:
/System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0)
将 mach-o 可执行文件中的加载命令更改为使用链接框架的另一个路径非常容易:
$ install_name_tool -change /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio @executable_path/CoreAudio.framework/Versions/A/CoreAudio foo
$ otool -L foo
foo:
@executable_path/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0)
$ DYLD_PRINT_LIBRARIES=1 ./foo
dyld: loaded: /Users/nikolai/foo-project/build/Debug/./foo
dyld: loaded: /Users/nikolai/foo-project/build/Debug/./CoreAudio.framework/Versions/A/CoreAudio
...
您可以准备(复制的)框架,以便在构建 foo 可执行文件时,它会自动具有正确的加载命令:
$ install_name_tool -id @executable_path/CoreAudio.framework/Versions/A/CoreAudio CoreAudio.framework/Versions/Current/CoreAudio