xcode使用buildscript添加嵌入式二进制文件

Ric*_*rte 5 xcode build-settings ios xcode8

我从第三方那里得到了一个动态框架,该框架由于缺少符号而无法在链接器阶段基于X86_64的拱门上进行编译,我已要求他们反复将此框架与框架捆绑在一起,但直到现在他们仍无法这样做。

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

我知道,如果这样做的话,我可能不得不从框架中删除拱门,但这比不能编译框架要好得多。

Dmy*_*sov 9

谢谢@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
Run Code Online (Sandbox Code Playgroud)

我还添加了框架的路径

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

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

  • 我遇到了问题,直到我意识到它无法处理空格。解决方法是添加额外的引号,例如:“$Example_To”。 (2认同)

Ric*_*rte 5

事实证明,嵌入式二进制阶段无非就是xcode将.framework复制到目标bundle 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
Run Code Online (Sandbox Code Playgroud)

另一个脚本和与库的二进制链接,我在其中复制并签名框架。

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
Run Code Online (Sandbox Code Playgroud)

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