【问题标题】:Xcode clang link: Build Dynamic Framework (or dylib) not embed dependenciesXcode clang 链接:构建动态框架(或 dylib)不嵌入依赖项
【发布时间】:2016-08-08 08:35:00
【问题描述】:

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

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

但是在构建动态框架或dylib时,这会导致未定义符号错误。我尝试了各种链接选项,例如-l-weak_library-weak_framework-I-rpath-rpath-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

【问题讨论】:

    标签: xcode hyperlink clang ld dylib


    【解决方案1】:

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

    -U 符号名称

    指定符号名可以没有定义。使用 two_level 命名空间,生成的符号将被标记为 dynamic_lookup,这意味着 dyld 将搜索所有加载的图像。

    -未定义处理

    指定如何处理未定义的符号。选项有:error、warning、suppress 或 dynamic_lookup。默认为错误。

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

    【讨论】:

    • -Wl,-undefined,dynamic_lookup 设置为OTHER_LDFLAGS 有效,但它会禁用所有警告。有没有办法只抑制一个符号的警告?使用选项-U 应该可以做到,但是将-U _mysymbol 设置为OTHER_LDFLAGS 不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2014-02-05
    • 2014-01-22
    • 2016-01-06
    相关资源
    最近更新 更多