首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cmake -交叉编译C++ iOS项目

Cmake -交叉编译C++ iOS项目
EN

Stack Overflow用户
提问于 2021-07-02 05:40:24
回答 1查看 1.4K关注 0票数 6

对于iOS项目的Cmake集成,没有一个很好的教程。在互联网上发现的很少,但却滞后于信息。我有一个C++项目,我想为我的iOS项目交叉编译它。我真的不是C++和Cmake主题方面的专家。不过,我跟踪了一个博客,这正是我所要寻找的。

正如博客中提到的,我使用工具链执行Cmake命令

代码语言:javascript
复制
mkdir build/ && cd build/ && cmake -G "Xcode" -DCMAKE_TOOLCHAIN_FILE=../ios-cmake/ios.toolchain.cmake ../../xxx-cpp -DPLATFORM=OS64COMBINED

并在.xcodeproj目录中生成build

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

以下是我的观察结果

用于设备的构建主iOS项目:生成失败

为"xxx“签名需要一个开发团队。在签名和功能编辑器中选择一个开发团队。

用于模拟器的构建主iOS项目:构建失败

clang:错误:没有这样的文件或目录:‘/user/user/Workspace/Cmake/Cmake示例/C++/lib/{C++命令Ld失败,退出代码为非零

为设备生成的生成Xcode项目:生成失败

ALL_BUILD目标的选择

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

对于.dylib目标:为"xxx“签名需要一个开发团队。在签名和功能编辑器中选择一个开发团队。

生成的模拟器Xcode项目:构建成功

ALL_BUILD目标的选择

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

另一位先生正面对着一辆同一问题

EN

回答 1

Stack Overflow用户

发布于 2021-07-12 04:05:11

解决这个问题有多种方法。

  1. 每次使用iOS-cmake使用codesign命令生成库后,您都可以通过提供适当的签名标识对库进行手动签名。这涉及到大量的手工工作,所以我希望你采用方法。
  2. 通过添加以下命令codesign -f -s "$EXPANDED_CODE_SIGN_IDENTITY“$EXPANDED_CODE_SIGN_IDENTITY,您可以使用运行脚本自动对所有包含的库进行签名。

在这里,签名标识可以是"$EXPANDED_CODE_SIGN_IDENTITY“,也可以是"$CODE_SIGN_IDENTITY",如果您使用cocoapods,则取决于您的工作区结构

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

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

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

  1. 添加构建依赖项:-为此,我们有更新的框架搜索路径构建设置,指向之前生成的库(这可以根据arm64设备或x86_64模拟器进行自定义)
  2. 给出构建依赖的排序,但是为了在运行时拥有它们,我们必须将这些库包含在.app文件夹的框架目录中,所以我们添加了一个运行脚本将这些库复制到框架目录中。使用下面这样的东西
代码语言:javascript
复制
# 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/"

Path_to_your_library可能会根据x86_64、arm64、调试和发布版本而有所不同。步骤1和步骤2将由xcode自动处理,如果您使用您的路由,但是它有很多警告,但是配置这些设置是一个一次性的活动,在日常开发过程中是很顺利的。

如果您保持正确的目录结构,您可以顺利地将它们添加到运行脚本中,如下所示

  1. 调试arm64变体的调试/arm64 64
  2. 版本arm64变体的版本/arm64 64
  3. 调试x86_64变体的调试/x86_64
  4. 发布x86_64变体的版本/x86_64

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68220107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档