【发布时间】:2021-01-03 13:50:17
【问题描述】:
编辑这是known CMake issue。
使用 Xcode 11(特别是 Xcode 11.2.1),我曾经能够使用以下命令交叉编译我的 iOS 项目:
cd /path/to/project
mkdir build
cd build
cmake .. -G Xcode -DCMAKE_SYSTEM_NAME=iOS \
"-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" \
-DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO \
-DCMAKE_IOS_INSTALL_COMBINED=YES \
-DCMAKE_INSTALL_PREFIX=install
cmake --build . --config Release --target install
这创建了一个包含两个切片的构建,一个切片用于arm64 架构(用于在真实设备上运行),一个切片用于x86_64 架构(用于在基于 Intel 的开发环境的模拟器中运行) .
升级到 Xcode 12(特别是 Xcode 12.3)后,这不再有效。构建始终失败并显示此错误消息(我添加了换行符):
error: unable to attach DB: error: accessing build database "/path/to/project/build/ios/build/XCBuildData/build.db":
database is locked Possibly there are two concurrent builds running in the same filesystem location.
问题似乎是 CMake 为 install 目标创建的构建后规则。在该构建后规则中,会在第一个构建仍在进行时启动第二个构建。
if test "$CONFIGURATION" = "Release"; then :
cd /path/to/project/build/ios
/usr/local/Cellar/cmake/3.19.2/bin/cmake -DBUILD_TYPE=$CONFIGURATION -DEFFECTIVE_PLATFORM_NAME=$EFFECTIVE_PLATFORM_NAME -P cmake_install.cmake
fi
当我不再将CMAKE_IOS_INSTALL_COMBINED 设置为YES 时,构建成功,但生成的构建仅包含一个切片(在我的情况下为arm64,可能是因为这是CMAKE_OSX_ARCHITECTURES 中列出的第一个架构)。
我正在考虑为每个架构单独构建,然后手动将切片拼接在一起。在我走这条路之前,有没有人能够找到更优雅的解决方案?
环境:macOS 11.1、Xcode 12.3、CMake 3.19.2
【问题讨论】: