EDIT这是一个已知的CMake问题。
使用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
体系结构(在基于英特尔的开发环境上的模拟器中运行(。
在升级到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
CMake 3.19发行说明包含以下提示:
Xcode生成器现在在为Xcode 12.0或更高版本生成时使用Xcode"新建系统"。请参阅
CMAKE_XCODE_BUILD_SYSTEM
变量。可以使用CCD_ 9来切换到传统构建系统。
因此,目前的解决方法是将-T
选项添加到构建系统生成命令行:
cmake .. -G Xcode -T buildsystem=1
-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
只要Xcode仍然支持遗留的构建系统,这就应该起作用。Xcode 12发行说明中有这样一句话:
旧版构建系统已弃用,并将在将来的版本中删除。(62742902(
因此,-T buildsystem=1
选项只能被视为临时解决方案。