我正在尝试在 Mac OS X 10.6.8上运行为10.7构建的二进制可执行文件(下例中的 ISCAgent)。
二进制文件的问题在于它取决于 兼容版本为7.0.0的/usr/lib/libcurl.4.dylib,而我只安装了6.0.0版本:
$ otool -L ISCAgent
ISCAgent:
@executable_path/libsslserver.dylib (compatibility version 0.0.0, current version 0.0.0)
@executable_path/libssl.dylib (compatibility version 1.0.0, current version 1.0.0)
@executable_path/libcrypto.dylib (compatibility version 1.0.0, current version 1.0.0)
@executable_path/libcachecom.dylib (compatibility version 0.0.0, current version 0.0.0)
@executable_path/libxerces-c-3.1.dylib (compatibility version 0.0.0, current version 0.0.0)
@executable_path/libicuuc.40.dylib (compatibility version 40.0.0, current version 40.0.0)
@executable_path/libicudata.40.dylib (compatibility version 40.0.0, current version 40.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
$ otool -L libxerces-c-3.1.dylib
libxerces-c-3.1.dylib:
@executable_path/libxerces-c-3.1.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libcurl.4.dylib (compatibility version 7.0.0, current version 7.0.0)
@executable_path/libicuuc.40.dylib (compatibility version 40.0.0, current version 40.0.0)
@executable_path/libicudata.40.dylib (compatibility version 40.0.0, current version 40.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
$ otool -L /usr/lib/libcurl.4.dylib
/usr/lib/libcurl.4.dylib:
/usr/lib/libcurl.4.dylib (compatibility version 6.0.0, current version 6.1.0)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
/System/Library/Frameworks/LDAP.framework/Versions/A/LDAP (compatibility version 1.0.0, current version 2.2.0)
/System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos (compatibility version 5.0.0, current version 5.0.0)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 41.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)
目前,我刚刚用我自己在 Snow Leopard 上构建的可执行文件替换了libxerces-c-3.1.dylib,一切似乎都正常。
但是,我想知道我的其他选择是什么。
特别:
- 我怎么能(我很确定我不能,但仍然)在同一个 /usr/lib 目录中有不同版本的libcurl.4.dylib和不同的兼容性版本值?我在这里有点困惑——如果代码合同 (API) 和/或 ABI 发生变化,库文件名中的版本号也应该增加,不是吗?另一方面,如果我们有一个兼容版本机制,那么文件名中存在的原始版本号有什么用?
- 如何影响第 3 方共享对象中的硬编码库路径?我有一个位于 /opt/local/lib 下的 libcurl.4.dylib(来自 MacPorts,兼容版本 8.0.0),但导出正确的 DYLD_LIBRARY_PATH 没有帮助——libxerces-c-3.1.dylib 总是选择 libcurl.4 .dylib 来自 /usr/lib。