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

iOS*_*iOS 6 c++ xcode cmake cross-compiling ios

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

并且它.xcodeprojbuild目录中生成了 。

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

这是我的观察

为设备构建主 iOS 项目:构建失败

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

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

clang: 错误: 没有这样的文件或目录: '/Users/user/Workspace/Cmake/Cmake Sample/build/lib/{C++ project}/core/Debug-iphonesimulator/libxxx.dylib' 命令 Ld 失败,退出代码非零

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

选择ALL_BUILD目标

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

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

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

选择ALL_BUILD目标

我不知道在哪里可以找到解决方案,并且我已经投入了更多的时间来分析和进行许多尝试和错误。我真的需要一些关于为 iOS 设备交叉编译 Cpp 库的建议。提前致谢!!

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

Tej*_*eja 0

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

  1. 每次使用 iOS-cmake 构建库后,您都可以使用 codesign 命令通过提供适当的签名身份来手动对库进行签名。这涉及大量的手动工作,所以我希望你采用方法
  2. 您可以使用运行脚本自动签署所有包含的库,方法是添加以下命令 codesign -f -s "$EXPANDED_CODE_SIGN_IDENTITY" "$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/<library_name>"

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

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

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

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

  1. 添加构建依赖项:- 为此,我们更新了框架搜索路径构建设置,该设置指向之前生成的库(您可以根据 arm64 [设备] 或 x86_64 [模拟器] 进行自定义)
  2. 考虑到构建依赖关系已解决,但为了在运行时拥有它们,我们必须将这些库包含在 .app 文件夹的框架目录中,因此我们添加了一个运行脚本来将这些库复制到框架目录中。使用类似下面的东西

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

Path_to_your_library 可能会因 x86_64、arm64、调试和发布版本而异。如果您遵循自己的路线,则 xcode 会自动执行步骤 1 和 2,但它有很多注意事项,但配置这些设置是一次性活动,在日常开发过程中很顺利

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

  1. Debug/arm64 用于调试arm64变体
  2. Release/arm64 用于发布arm64变体
  3. Debug/x86_64 用于调试 x86_64 变体
  4. Release/x86_64 用于发布 x86_64 变体

还要确保您构建的是框架而不是 dylib,否则苹果在上传到应用商店时会抛出警告并拒绝