当我在 xcode 中添加 libcurl.4.tbd 作为依赖项时实际会发生什么?

问题描述

当我想添加 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.dylibotool -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,其中包含缓存中所有库的纯文本内存映射。