Xcode clang 链接:构建动态框架(或 dylib)不嵌入依赖项

BB9*_*B9z 3 xcode hyperlink clang dylib ld

I\xe2\x80\x99m 为 iOS 构建动态框架。它需要引用代码或其他库中的一些符号,但我不想将它们链接到框架中。

\n\n

这可以在构建静态库时实现,只需设置搜索路径并确保它们不包含在 target\xe2\x80\x99s 构建阶段中。

\n\n

但是当构建动态框架或dylib时,会导致未定义符号错误。我尝试了各种链接选项,例如-l -weak_library -weak_framework -I -rpath -rpath-link。但没有一个有效。

\n\n

链接命令如下所示:

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

BB9*_*B9z 7

clang 使用 ld 命令进行最终链接,我查了手册,发现-U可以-undefined忽略未定义的符号。

-U 符号名称

指定symbol_name没有定义也是可以的。使用two_levelnamespace,生成的符号将被标记为dynamic_lookup,这意味着dyld将搜索所有加载的图像。

- 未明确的治疗

指定如何处理未定义的符号。选项有:错误、警告、抑制或动态查找。默认是错误。

所以最终的解决方案设置-Wl,-undefined,dynamic_lookupOTHER_LDFLAGS,同时确保搜索路径设置正确。有用。