问题描述
当我想添加 libcurl 作为依赖项时,我在 Link Binary with Libraries 下添加 libcurl.4.tbd
并且它可以工作。据我了解,这些 tbd
文件是存根库,用于启用动态库的链接过程,同时保持 Xcode SDK 下载量很小(通过用一种占位符替换实际的 dylib)。
当我在 Xcode 中打开 libcurl.4.tbd
时,它列在 install-name /usr/lib/libcurl.4.dylib
下,我希望能找到这个文件。但是我无法在此目录或系统上的任何其他地方找到实际的 libcurl.4.dylib
。
otool -L
给了我相同的文件路径。
在这种情况下如何处理链接以及实际的 dylib
位于何处?
我运行的是 macOS 11.1
解决方法
在 macOS(至少在 Big Sur,在早期系统上不确定)和 iOS(自 iPhone OS 3.1 起)上,所有内置库都包含在一个大缓存文件中。 iPhone Dev Wiki 中提供了更多信息。
要在您的机器上找到缓存的实际位置,请使用 DYLD_PRINT_SEGMENTS
环境变量集运行编译的可执行文件。这将在 stderr 上产生大量输出,如下所示:
% DYLD_PRINT_SEGMENTS=1 ./your_executable
re-using existing shared cache (/System/Library/dyld/dyld_shared_cache_x86_64h):
0x7FFF2003B000->0x7FFF7FFBAFFF init=5,max=5 read execute
0x7FFF8003B000->0x7FFF8DFDEFFF init=3,max=3 read write data
0x7FFFC003B000->0x7FFFE22DAFFF init=1,max=1 read
dyld: Main executable mapped /Users/janten/Desktop/linky/./a.out
__PAGEZERO at 0x00000000->0x100000000
__TEXT at 0x106305000->0x106309000
__DATA_CONST at 0x106309000->0x10630D000
__DATA at 0x10630D000->0x106311000
__LINKEDIT at 0x106311000->0x106315000
dyld: Using shared cached for /usr/lib/libcurl.4.dylib
__TEXT at 0x7FFF32F8F000->0x7FFF32FF5000
__DATA at 0x7FFF89A67070->0x7FFF89A6A04C
__LINKEDIT at 0x7FFFC05FF000->0x7FFFDEF17CB0
...
在本例中,缓存位于/System/Library/dyld/dyld_shared_cache_x86_64h。如果您想查看此文件的完整内容,请查看 /System/Library/dyld/dyld_shared_cache_x86_64h.map,其中包含缓存中所有库的纯文本内存映射。