xcode 使用构建脚本添加嵌入式二进制文件
xcode add embedded binary with buildscript
我从第三方得到了一个动态框架,由于缺少符号,在链接器阶段无法在基于 X86_64 的 archs 上编译,我反复询问过他们将此架构与他们的框架捆绑在一起,但他们直到现在才能够这样做。
现在我的问题如下,无论如何我都找不到使用构建设置添加阶段嵌入式二进制阶段,嵌入式二进制文件在 [=21= 期间如何链接到应用程序] 进程?
我知道如果他们这样做,我可能不得不从框架中删除 arch,但总比不能编译框架好。
事实证明,嵌入式二进制阶段无非是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
和另一个脚本和 link 带有库的二进制文件,我在其中复制并签署了框架。
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
这只是我为实现此目的而快速创建的一个快速粗略的脚本。我只允许这种情况发生,我的目标是一个设备,因为这是我的初衷。但可以删除。
谢谢@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",你的路径和框架名称当然可以不同
我从第三方得到了一个动态框架,由于缺少符号,在链接器阶段无法在基于 X86_64 的 archs 上编译,我反复询问过他们将此架构与他们的框架捆绑在一起,但他们直到现在才能够这样做。
现在我的问题如下,无论如何我都找不到使用构建设置添加阶段嵌入式二进制阶段,嵌入式二进制文件在 [=21= 期间如何链接到应用程序] 进程?
我知道如果他们这样做,我可能不得不从框架中删除 arch,但总比不能编译框架好。
事实证明,嵌入式二进制阶段无非是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
和另一个脚本和 link 带有库的二进制文件,我在其中复制并签署了框架。
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
这只是我为实现此目的而快速创建的一个快速粗略的脚本。我只允许这种情况发生,我的目标是一个设备,因为这是我的初衷。但可以删除。
谢谢@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",你的路径和框架名称当然可以不同