此文已过期,仅供参考
可以看我新写的文章
搭建msys2基础开发平台
-----------更新-------------
由于gdb8.2.1使用g++编译,编译速度很慢,即使什么都没改也要编译20分钟,所以建议gdb更换为gdb-7.9-2,python3更换为python2,版本为python2-2.7.13(更新版本会出现无法识别的情况)
1.搭建msys2环境
在学习编译gdb的过程中,一定要和本文出现的各软件版本保持一致,否则很容易因为版本的原因出现一些奇怪的问题。
在win下编译gdb首先要搭建msys2的开发环境,先从官网下载msys2-i686-20190524.exe
https://www.msys2.org/
官网以后会更新版本,为了和本文写的版本保持一致,最好在清华镜像站找到msys2-i686-20190524.exe版本下载:
https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/i686/
这里为了避免不必要的麻烦,所有软件都选32位的,即使电脑是64位的也选32位安装。
下载后直接安装即可,然后需要配置pacman软件源镜像,使用的是清华的开源镜像(msys2官方的源很慢),步骤如下
编辑 /etc/pacman.d/mirrorlist.mingw32 ,在文件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
编辑 /etc/pacman.d/mirrorlist.mingw64 ,在文件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64
编辑 /etc/pacman.d/mirrorlist.msys ,在文件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch
注意: 这里不建议执行 pacman -Sy 刷新软件包数据,因为刷新后接下来安装liblzma-devel是最新的版本,与xz的依赖不兼容
2.安装gcc和make
配置好后需要用pacman安装gcc和make,使用如下命令
pacman -S gcc
以上命令是下载默认的gcc版本,不同的电脑上可能存在差异,所以最好到以下网站下载gcc-7.4.0-1的安装包
https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/i686/
假设放在E:\download\gcc-7.4.0-1-i686.pkg.tar.xz,则安装命令是
pacman -U /e/download/gcc-7.4.0-1-i686.pkg.tar.xz
同理安装make也是先下载安装包make-4.2.1-1-i686.pkg.tar.xz,然后在本地安装
pacman -U /e/download/make-4.2.1-1-i686.pkg.tar.xz
如果使用pacman -S make命令安装可能会和我的版本不一样
3.下载gdb源码包
我下的版本是gdb-8.2.1-2.src.tar.gz,地址如下
https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/sources/
4.编译源码
把之前下载的包解压,我的是放在E:\source\gdb-8.2.1-2.src\gdb,然后进入该目录,执行makepkg
可以看到出错了,出错的原因是缺少依赖,所以要先安装各依赖
pacman -S expat
pacman -S python3
pacman -S libiconv-devel zlib-devel ncurses-devel liblzma-devel libexpat-devel libreadline-devel
当然也可以本地安装
pacman -U /c/Users/Administrator/Downloads/expat-2.2.6-1-i686.pkg.tar.xz
pacman -U /c/Users/Administrator/Downloads/python-3.7.3-1-i686.pkg.tar.xz
这是我安装的版本(注:如果刷新软件源后,liblzma-devel的版本是5.2.5-1,与xz依赖不兼容,这时不要选择更新xz,而应该本地安装liblzma-devel-5.2.4-1)
注意到python3安装的版本是python-3.7.3-1,这是一个最大的坑,这个版本是不能用的,我稍后会说明,现在先暂时用这个版本。
安装后继续执行makepkg,仍然出错了
pgp检验很麻烦,可以选择跳过,使用如下命令选项:
makepkg --skippgpcheck
还是出错,这是因为gdb源码是在linux编译的,想要在windows下编译需要先打补丁,打补丁使用patch命令,这里没安装,需要先安装patch
pacman -S patch
安装后重新运行makepkg --skippgpcheck
提升缺少texinfo包,接着安装texinfo
pacman -S texinfo
安装时好像出了点意外,既然不能在线安装,那么可以试试本地安装
pacman -U /c/Users/Administrator/Downloads/texinfo-6.6-1-i686.pkg.tar.xz
如果出错了,可以输入mv /var/lib/pacman/db.lck /tmp命令把db.lck文件移除后重新安装,就可以安装成功了。
重新运行makepkg --skippgpcheck
又出错了,提示没找到python,可是我明明安装了python3.7啊,也可以正常运行
到这里我不知道该怎么办了,为此我选择去看makepkg和configure的源码,关键代码如下
if ac_fn_c_try_link "$LINENO"; then :
have_libpython=${version}
found_usable_python=yes
PYTHON_CPPFLAGS=$new_CPPFLAGS
PYTHON_LIBS=$new_LIBS
fi
... ...
fi
fi
if test "${have_libpython}" = python2.7 -o "${have_libpython}" = python27; then
... ...
fi
if test "${have_libpython}" = no; then
case "${with_python}" in
yes)
as_fn_error $? "python is missing or unusable" "$LINENO" 5
;;
auto)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: python is missing or unusable; some features may be unavailable." >&5
$as_echo "$as_me: WARNING: python is missing or unusable; some features may be unavailable." >&2;}
;;
*)
as_fn_error $? "no usable python found at ${with_python}" "$LINENO" 5
;;
esac
else
if test -n "${python_prefix}"; then
cat >>confdefs.h <<_ACEOF
#define WITH_PYTHON_PATH "${python_prefix}"
_ACEOF
if ac_fn_c_try_link “$LINENO”; 这个条件没进去,导致have_libpython还是初始化的值no,跟到ac_fn_c_try_link函数里看了一下,最后由于代码写的实在太复杂了,没看懂,通过看脚本代码来解决问题这条路走不通。
看看有没有其他方法,说不定是python3.7太新了,当前的msys2环境识别不出来呢,可以换一个旧点的版本试试。
通过pacman -R python
命令卸载当前的python,安装一个旧一点的版本python-3.4.3-2-i686.pkg.tar.xz
再次运行makepkg --skippgpcheck
… …
最后执行到check的时候出错,这说明build已经成功,编译完成,check出错了也没关系,我们不关心这个,因为用不到。
到E:\source\gdb-8.2.1-2.src\gdb\src\gdb-8.2.1\gdb去看一下
最后终于生成了所需要的gdb.exe可执行文件,大功告成!