最近需要对AOSP上的aapt和aapt2进行自定义,但是AOSP的整个源码树过大,完整释放后约200G,不大适合整个拉下来编译,因此对构建环境进行精简,只拉取aapt和aapt2的关键依赖项目,使用cmake进行编译,整个移植过程很顺利,并且成功的编译出了mac和linux的可执行文件和对应的动态库,包括x86和x86_64的文件,但是在编译windows的版本的时候,遇到了一点小问题,就是AOSP上的依赖项目,存在软链接,但是windows系统是不支持软链接的,因此不能在windows上进行编译。
对于windows不支持软链接,其实有两种处理方式:
- 手动拷贝对应软链接文件到对应的目录,显然这是很不明智的选择,因为文件太大了
- 不在windows上进行编译,选择linux下交叉编译windows可执行文件。我这里选择的就是这一种。
安装依赖
由于要进行交叉编译,因此需要安装交叉编译工具链mingw-w64
1 | sudo apt-get install mingw-w64 |
安装完成后,mingw-gcc和mingw-g++默认使用的线程模型是win32的,但是我们需要使用posix的线程模型,因此分别执行以下命令,然后将工具链指向带-posix后缀的工具链
1 | sudo update-alternatives --config x86_64-w64-mingw32-gcc |
编写cmake交叉编译脚本
参考之前写的一篇文章Mac生成Linux交叉编译工具链,编写cmake交叉编译脚本,创建windows.toolchain.cmake文件,里面的内容为:
1 | # 安装 mingw-w64 |
优化cmake交叉编译脚本支持32位可执行文件
上面的只能编译出64位的文件,要想编译出32位的文件,需要使用i686开头的工具链,因此,可以简单的通过参数进行控制是使用64位还是32位的,优化后的cmake脚本如下
1 | # 安装 mingw-w64 |
生成cmake构建文件
如果生成64的构建文件,则使用
1 | cmake -H"./" -B"./build-cmake-windows" -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=windows.toolchain.cmake |
但是如果需要生产32位的构建文件,则需要传递USE_32BITS=1参数,如下
1 | cmake -H"./" -B"./build-cmake-windows-x86" -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=windows.toolchain.cmake -DUSE_32BITS=1 |
mac下编译
mac下可使用brew install mingw-w64安装mingw-w64,但是安装出来的mingw-w64线程模型是win32的,而我们需要使用posix线程模型,因此如果要想在mac下进行编译,则需要自己编译mingw-w64,启用posix线程模型,有兴趣可以自行研究。