Xcode clang link: 构建动态框架(或 dylib)未嵌入依赖项

Xcode clang link: Build Dynamic Framework (or dylib) not embed dependencies

我正在为 iOS 构建一个动态框架。它需要从代码或其他库中引用一些符号,但我不想 link 它们进入框架。

这可以在构建静态库时实现,只需设置搜索路径并确保它们不包含在目标的构建阶段。

但是在构建动态框架或dylib时,出现未定义符号错误。我尝试了各种 link 选项,例如 -l -weak_library -weak_framework -I -rpath -rpath-link。但是 none 有效。

link 命令如下所示:

clang -arch x86_64 -dynamiclib
    -isysroot *iPhone_SDK_PATH* 
    *OPTIONS_NOT_IMPORTANT* 
    -install_name @rpath/Foo.framework/Foo
    -Xlinker -rpath -Xlinker @executable_path/Frameworks
    -Xlinker -rpath -Xlinker @loader_path/Frameworks
    -Xlinker -rpath -Xlinker *BUILD_PATH*
    -mios-simulator-version-min=7.0
    -Xlinker -no_deduplicate
    -Xlinker -objc_abi_version
    -Xlinker 2 
    -fobjc-arc -fobjc-link-runtime
    -framework Foundation
    -single_module
    -compatibility_version 1
    -current_version 1
    -Xlinker -dependency_info
    -Xlinker *BUILD_PATH*/Foo.build/Objects-normal/x86_64/Foo_dependency_info.dat 
    -o *BUILD_PATH*/Foo.framework/Foo

clang用ld命令做最后的link,查了手册发现-U-undefined可以忽略未定义的符号

-U symbol_name

Specified that it is ok for symbol_name to have no definition. With two_levelnamespace, the resulting symbol will be marked dynamic_lookup which means dyld will search all loaded images.

-未定义处理

Specifies how undefined symbols are to be treated. Options are: error, warning, suppress, or dynamic_lookup. The default is error.

所以最终的解决方案是将-Wl,-undefined,dynamic_lookup设置为OTHER_LDFLAGS,同时确保搜索路径设置正确。有效。