zsign项目是github开源社区一个跨平台( macOS, Linux , Windows )的ios系统ipa包签名命令行工具。这篇博客是记录我在linux下用mingw-w64交叉编译环境,把项目编译出win平台下可执行程序。本来是想直接在win平台编译的,然后遇到一堆报错,懒得去纠正了。
zsign项目地址:https://github.com/zhlynn/zsign
操作系统 Ubuntu-20.04.1桌面版 下载链接:https://mirrors.nju.edu.cn/ubuntu-releases/20.04.1/ubuntu-20.04.1-desktop-amd64.iso
编译工具mingw-w64 直接apt-get安装
项目依赖项,mman-win32 项目github链接:https://github.com/witwall/mman-win32;
OpenSSL_1_0_2s 项目github链接:https://github.com/openssl/openssl
我本人是用的VMware虚拟机安装的Ubuntu,虚拟机安装系统就不多说了,网上一堆教程。
好开始安装编译工具和下载项目和依赖项
1.安装mingw-w64 直接终端模拟器输入命令
sudo apt-get install mingw-w64
sudo apt-get install git
sudo apt-get install make
4.下载zsign项目
git clone https://github.com/zhlynn/zsign.git
git clone https://github.com.cnpmjs.org/openssl/openssl.git
openssl项目文件比较多,下载时候几十kb的速度贼慢,建议用github镜像服务器
原地址:https://github.com/xxx.git
替换为:https://github.com.cnpmjs.org/xxx.git
6.下载mman-win32项目
git clone https://github.com.cnpmjs.org/witwall/mman-win32.git
1.编译mman-win32项目
cd ~/下载/mman-win32
./configure --cross-prefix=x86_64-w64-mingw32-
make
–cross-prefix=x86_64-w64-mingw32- 这个参数是配置编译器为x86_64-w64-mingw32-gcc
输错了 会报路径错误,或者使用了其他编译器编译 导致出现错误
2.编译openssl项目
cd ~/下载/openssl
git checkout OpenSSL_1_0_2s
./Configure --cross-compile-prefix=x86_64-w64-mingw32- mingw64
make
git checkout OpenSSL_1_0_2s这个命令是把切换到1.0.2s这个版本
./Configure --cross-compile-prefix=x86_64-w64-mingw32- mingw64
这个命令同上 是配置编译环境目录和编译器的,我在这里因为直接复制的zsign项目下的教程里的命令 所以少了一个’-‘符号 所以这里报错了
这是修正以后正在编译的截图,编译openssl需要一点时间
3.编译zsign项目链接生成windows平台下可执行程序
cd ~/下载/zsign
x86_64-w64-mingw32-g++ \
*.cpp common/*.cpp -o zsign.exe -I../mman-win32 -I../openssl/include/ -L../openssl -L../mman-win32 -lmman -lcrypto -lgdi32 -std=c++11 -DWINDOWS -m64 -static-libgcc
-I…/mman-win32 -I…/openssl/include/ 这两个参数表示编译器首先从这两个目录下去寻找头文件。
-L…/openssl -L…/mman-win32 这两个参数表示从这两个目录下寻找库文件
-lmman -lcrypto -lgdi32 这三个参数是表示库文件名称
-DWINDOWS 这个参数表示添加一个WINDOWS的宏定义 和 咱们下面报错有点关系
直接运行上面的命令会出现这个错误,我当时就懵逼了,相信大多数人从网上下载开源代码在自己的编译环境里跑不通肯定都是瞬间懵逼,然后很郁闷的找问题
这个错误是因为mman.h头文件是Linux系统下专属的,所以咱们才需要编译上面的mman-win32项目。
根据错误信息找到目录下的common.h头文件打开看一下
然后打开mman-win32目录下可以发现 sys/mman.h的路径不对
上面红圈圈 第7行代码 咱们需要给他修改一下
#if defined(WINDOWS)
#include
#else
#include
#endif
然后重新执行上面的编译命令
哦豁,瞬间懵逼,又来了个错误
然后网上查了下包含DT_DIR的宏命令和struct dirent结构体的头文件也是Linux下特有的,这里我走了些弯路,开始尝试修改zsign源码,然后发现 导致了更多错误,不得不放弃了,幸好 继续在网上查发现了这个玩意儿
dirent.h这个头文件的win平台下的实现
项目github地址:https://github.com/tronkko/dirent
git clone https://github.com/tronkko/dirent
下载下来看了下,准备替换一下mingw64编译环境下的这个头文件试试看
cd ~/下载/dirent/include
sudo cp dirent.h /usr/share/mingw-w64/include
这里真机运行的小伙伴可以备份一下这个文件再复制过去,我是虚拟机里操作的,有快照备份,不需要这个操作
复制完以后再重新运行一遍上面的编译命令,我都准备好再面对一个错误抛出了。
然后啥反应没有 等了一会儿
编译成功了
心里是激动的。几经波折 终于给编译出来了
这里先放出我编译好的可执行程序,有需要的小伙伴自行下载,没积分的小伙伴还是自己走一遍编译的过程吧。
下载地址:https://download.csdn.net/download/a513436535/12835974
这是我逛csdn这么久来第一篇博客,感慨一下,至于为什么忽然想发这篇博客,我想可能是因为想分享一下激动的心情吧。
因为最近的一个项目需要ipa的重签名,就找到了zsign这个开源项目,因为我是搞C#这一块的,对linux不是很熟悉,然后走了一些弯路,废了好些时间还是没搞定。
一开始我是在centos7上去尝试的,因为centos7这个系统我很早就安装在虚拟机里面了,然后mingw-w64这个工具就把我拦住了, centos7上面没有这个编译工具的源,然后尝试了好几个方法安装都没成功,最后试了一下脚本安装的方法,其中一个脚本下载地址:https://github.com/Zeranoe/mingw-w64-build 有需要的小伙伴可以看看,然后最终还是不行,我搞不定这玩意。
然后继续找啊,找到了msys2这个玩意儿,windows下的一个类linux的环境 自带mingw64的编译工具。
然后,呵呵,,,呵呵呵呵呵,,尼玛这个东西也是搞不定,诶 还是因为对linux不熟悉啊。
都快准备放弃zsign这个工具了,我也想在网上能不能找到别人编译好的,可惜,没找到。
折腾了挺久的,就想到换个linux的版本试试吧,然后对比了下各个版本,就决定换ubuntu了,然后就直接上ubuntu官网下载os镜像。
最后终于搞定了。
激动的心,颤抖的手,发个帖子抖一抖。
希望我这篇博客能够帮到和我情况差不多的小伙伴吧。。。
写到最后
以前都是找别人的博客看,自己写一篇的感觉还挺好的,不知道下次写博客是啥时候的事了。
转载请保留原文链接:https://blog.csdn.net/a513436535/article/details/108539238
这玩意儿大家是这么玩的没错吧