【问题标题】:xcode add embedded binary with buildscriptxcode 使用 buildscript 添加嵌入式二进制文件
【发布时间】:2016-11-03 11:13:48
【问题描述】:

我从第三方获得了一个动态框架,由于缺少符号,它在链接器阶段无法在基于 X86_64 的架构上编译,我曾多次要求他们将此架构与他们的框架捆绑在一起,但他们直到现在都无法这样做。

现在我的问题如下,无论如何我都找不到使用构建设置添加阶段嵌入式二进制阶段,嵌入式二进制文件在构建/链接器过程中如何链接到应用程序?

我知道如果他们这样做,我可能不得不从框架中剥离拱门,但它胜过无法编译框架。

【问题讨论】:

    标签: ios xcode xcode8 build-settings


    【解决方案1】:

    谢谢@RicardoDuarte; iPhone 和模拟器都有我的脚本。

    Example_To=$BUILT_PRODUCTS_DIR"/"$PRODUCT_NAME".app/Frameworks/Example.framework/"
    Example_From=$PROJECT_DIR"/../out/Build/Products/"$CONFIGURATION$EFFECTIVE_PLATFORM_NAME"/Example.framework"
    
    mkdir -p $BUILT_PRODUCTS_DIR"/"$PRODUCT_NAME".app/Frameworks"
    cp -Rv $Example_From $Example_To
    
    if [[ $PLATFORM_NAME == 'iphoneos' ]]; then
        CODE_SIGN_IDENTITY_FOR_ITEMS="${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
    
        if [ "${CODE_SIGN_IDENTITY_FOR_ITEMS}" = "" ] ; then
            CODE_SIGN_IDENTITY_FOR_ITEMS="${CODE_SIGN_IDENTITY}"
        fi
    
        codesign --force --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" $Example_To
    fi
    

    我还添加了框架路径

    $(PROJECT_DIR)/../out/Build/Products/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

    到“Framework Search Paths”和“Header Search Paths”,你的路径和框架名称当然可以不同。

    【讨论】:

    • 还有一种更有趣的解决“通用框架”问题的方法..medium.com/allatoneplace/…
    • 我遇到了问题,直到我意识到它无法处理空格。解决方法是添加额外的引号,例如:“$Example_To”。
    【解决方案2】:

    事实证明,嵌入式二进制阶段只不过是 xcode 将 .framework 复制到目标捆绑框架文件夹中,以实现我创建完全手动添加框架的脚本的最终意图。

    这导致了两个脚本,一个是在构建阶段的目标依赖之后添加的,必须在编译源之前:

    if [[ $PLATFORM_NAME == 'iphoneos' ]]; then
    
        SOME_FRAMEWORK=$BUILT_PRODUCTS_DIR"/"$PRODUCT_NAME".app/Frameworks/someframework.framework/"
        export LIBRARY_SEARCH_PATHS=$LIBRARY_SEARCH_PATHS" "$SDKROOT"/someframework.framework"
    fi
    

    另一个脚本和链接二进制文件与库,我在其中复制和签署框架。

    if [[ $PLATFORM_NAME == 'iphoneos' ]]; then
        MY_FRAMEWORK=$BUILT_PRODUCTS_DIR"/"$PRODUCT_NAME".app/Frameworks/someframework.framework/"
        mkdir -p $BUILT_PRODUCTS_DIR"/"$PRODUCT_NAME".app/Frameworks"
        cp -Rv $PROJECT_DIR"/someframework.framework" $MY_FRAMEWORK
    
        CODE_SIGN_IDENTITY_FOR_ITEMS="${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
        if [ "${CODE_SIGN_IDENTITY_FOR_ITEMS}" = "" ] ; then
            CODE_SIGN_IDENTITY_FOR_ITEMS="${CODE_SIGN_IDENTITY}"
        fi
    
        codesign --force --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" $MY_FRAMEWORK"/<binary of framework>"
    fi
    

    这只是我为实现这一目标而快速创建的一个快速粗略的脚本。我只允许这种情况发生,我的目标是一个设备,因为这是我的初衷。但可以删除。

    【讨论】:

    • 为我工作!另外不要忘记在 Build Settings 中将 Runpath Search Path 设置为 @executable_path/Frameworks。
    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 2015-03-03
    • 2019-10-06
    • 2015-12-29
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多