当前位置: 首页 > 知识库问答 >
问题:

Cmake-iOS交叉编译C项目

方砚
2023-03-14

对于iOS项目的Cmake集成,没有很好的教程。互联网上找到的信息很少,但信息滞后。我有一个C项目,我想为我的iOS项目交叉编译它。我真的不是C和Cmake主题的专家。尽管如此,我还是关注了一个博客,这正是我想要的。

如博客中所述,我使用工具链来执行 Cmake 命令

mkdir build/ && cd build/ && cmake -G "Xcode" -DCMAKE_TOOLCHAIN_FILE=../ios-cmake/ios.toolchain.cmake ../../xxx-cpp -DPLATFORM=OS64COMBINED

它生成了<代码>。build目录中的xcodeproj。

按照指示,我将生成的Xcode解决方案包含到我的主要iOS项目中,并将C项目添加到“框架、库和嵌入式内容”和“依赖项”中。实际上,我想为iOS设备构建库,因此,正如同一博客中的评论所提到的,“从Cmake生成的Xcode项目本身不需要任何签名。相反,您将生成的Xcode项目包含在另一个does已配置签名的Xcode项目中”,我的iOS项目已经进行了代码签名。当我试图构建项目时,我遇到了一个构建错误,说“为xxx签名”需要一个开发团队

以下是我的观察结果

为设备生成主 iOS 项目:生成失败

签约“xxx”需要开发团队。在签约中选择一个开发团队

为模拟器构建主iOS项目:构建失败

clang:错误:没有这样的文件或目录:“/Users/user/Workspace/Cmake/Cmake Sample/build/lib/{ C project }/core/Debug-iphone simulator/libxxx . dylib”命令ld失败,返回非零退出代码

为设备生成生成的Xcode项目:Build FAILED

选择ALL_BUILD目标

对于.app目标:缺少捆绑标识符。xxx没有捆绑标识符。在生成设置编辑器中为PRODUCT_BUNDLE_IDENTIFIER添加值。

对于. dylib目标:为“xxx”签名需要开发团队。在签名中选择开发团队

为模拟器构建生成的Xcode项目:BUILD SUCCEEDED

选择ALL_BUILD目标

我不知道在哪里可以找到解决方案,我已经花了更多的时间分析和做了许多尝试和错误。在交叉编译iOS设备的Cpp库时,我确实需要一些建议。提前谢谢!!

另一位先生也面临同样的问题

共有1个答案

林君博
2023-03-14

有多种方法可以解决此问题。

  1. 每次使用iOS cmake构建库后,您都可以通过提供适当的签名标识,使用coesign命令手动签名库。这需要大量的手动操作,所以我希望您使用方法
  2. 通过添加以下命令代码签名-f-s“$EXPANDED_CODE_sign_IDENTITY”“$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH,可以使用运行脚本自动对所有包含的库进行签名/

这里签名身份可以是“$EXPANDED_CODE_SIGN_IDENTITY”或“$CODE_SIGN_IDENTITY”,这取决于您是否使用cocoapods的工作空间结构

第二种方法的思想是,xcode(xcodebuild)在构建项目时提供的环境变量很少,因此我们尝试利用用于对应用程序进行签名的同一签名标识来对库进行签名。

另外,关于集成本机库的方式,我个人不建议这样做,因为如果您在生成的xcode项目中更改任何设置,如果您再次生成xcode项目,它将消失。

我们在项目中有一个类似的依赖项,因此我们采取了在命令行中构建库的方法(您可以选择使用xcode生成器或直接使用cmake和make来构建它)。然后我们不得不在项目中设置一些设置

  1. 添加构建依赖项:-为此,我们更新了指向以前生成的库的框架搜索路径构建设置(这可以根据arm64[devices]或x86_64[simulator]进行自定义)
  2. 考虑到构建依赖关系已得到整理,但为了在运行时拥有它们,我们必须将这些库包含在.app文件夹的frameworks目录中,所以我们添加了一个运行脚本,以将这些库复制到framework目录。使用以下内容

# Retrieve architecture type
ARCHITECTURE=""

if [ $NATIVE_ARCH == "i386" ] || [ $NATIVE_ARCH == "x86_64" ] ; then
    ARCHITECTURE="x86_64"
else
    ARCHITECTURE="arm64"
fi 

# Retrieve build configuration
BUILD_CONFIG=""

if [ $CONFIGURATION == "Debug" ] ; then
    BUILD_CONFIG="Debug"
else
    BUILD_CONFIG="Release"
fi

# Copying library
cp -r <path_to_your_library> "$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/"

路径_to_your_library可能因x86_64、arm64、调试和发布版本而异。如果按照您的路线进行,步骤1和2将由xcode自动处理,但它有很多警告,但配置这些设置是一次性的活动,在日常开发过程中非常顺利

如果您维护了适当的目录结构,您可以顺利地将它们添加到运行脚本中,如下所示

    < li >用于调试arm64变体的Debug/arm 64 < Li > Release/arm 64 for Release arm 64 variant < li>Debug/x86_64用于调试x86_64变体 < Li > Release/x86 _ 64 for Release x86 _ 64 variant

还要确保您构建框架而不是dylib,否则Apple将在上传到appstore时抛出警告并拒绝

 类似资料:
  • 问题内容: 我创建了一个交叉编译的arm可执行文件。我想找到可执行文件的库依赖项。我正在使用ubuntu natty并安装了不包含ldd的arm-linux- gnueabi工具链。有没有可用的工具来查看Linux中arm可执行文件库的依赖性。 问题答案: 这有点儿混乱,但这是我能找到的最好的解决方案,对于基本用途它确实很好用-只需使用其他交叉工具将此脚本另存为“ arm-none-linux-g

  • 我在、Visual C++和交叉编译器的帮助下为构建项目。它运行良好,但如何处理情况时,我需要链接到库?我是否应该用当前的交叉编译器构建所有必需的库?例如如何处理库?

  • 本文档说明如何在kali linux上配置ARM交叉编译环境,是我们多份关于”定制ARM镜像”的文档的起点. 开发机的配置 编译内核生成镜象通常需要大量硬盘空间.确保你的开发机至少有50G可用硬盘空间以及足够的内存,CPU不要太差. 安装依赖 先安装ARM交叉编译所需的依赖. apt-get install git-core gnupg flex bison gperf libesd0-dev b

  • 问题内容: 显然,Apple App Store不允许交叉编译器,因此开发人员需要熟悉Objective-C才能为iPhone创建应用程序。 我想知道,是否有一个交叉编译器将采用Objective- C应用程序代码并将其重建为可打包为Android的类似Java应用程序?这样,开发人员仍然只能学习一种语言(obj-c),但可以在许多设备上发布应用程序。 我知道Java端口不如本地编码的应用程序最佳

  • 问题内容: 各位 我正在尝试在Ant和终端上玩Javac Cross编译。在本地和集成环境中,我在一个非常基本的问题上遇到了同样的问题。 我在linux终端(以及在Windows和cmd的cygwin上)上运行此命令: 与Main.java一起使用,仅是System.out.println。 我收到错误消息: 我在本地Windows机器上的配置大致相同,结果完全相同。 我的理解是,交叉编译就是使用

  • 问题内容: 我想知道是否有可能(如果可以:如何)使用Go交叉编译共享库。说我有这段代码: 在中。在Mac上,我可以运行 获得名为的共享库。与Linux类似,只是扩展名为。 现在,我想使用Linux作为构建库的主要平台(适用于Mac和Windows)。我有什么选择? 设置来运行上面的linux上,我得到 有任何想法吗? 问题答案: 您面临的问题实际上与编译共享库或可执行文件无关,而与使用cgo并尝试