已编译好的代码下载:https://download.csdn.net/download/travel981cn/10671464,这里面包括:
bzip2-1.0.6-win64-vc141.zip
glib-2.58.0-win64-vc141.zip
libiconv-1.15-win64-vc141.zip
libintl-0.19.8.1-win64-vc141.zip
pcre-8.42-win64-vc141.zip
zlib1-1.2.11-win64-vc141.zip
其中:
glib依赖 libintl pcre zlib
intl依赖 libiconv
pcre依赖 bzip2 zlib
准备工作:
MSVC,使用C++的桌面开发。安装在默认位置。
WIN10SDK,https://developer.microsoft.com/zh-cn/windows/downloads/windows-10-sdk 装好后SDK变成17134.12
python3,https://www.python.org/downloads/windows/ 这个页面选择一个版本。我用的是64位的。安装在 D:\platform\python3
cmake,https://cmake.org/download/ 我选的是 ZIP版本,cmake-3.12.2-win64-x64.zip 解压后放在 D:\platform\cmake
各种源码,上面的glib包只包括 include 和 lib,
libiconv 和 libintl 源码在此:https://download.csdn.net/download/travel981cn/10546285
pcre源码在此:https://download.csdn.net/download/travel981cn/10629436 或者从官方下载,
zlib源码从官方下载:http://www.zlib.net/
bzip2官网已经挂了,我上传一份源码在此:https://download.csdn.net/download/travel981cn/10672717
开始编译,使用call调用批处理,你也可用从开始菜单中打开本机工具,如果源码与批处理的命令行窗口不在同一磁盘中(盘符不同),进入请使用 cd /d
比如你当前CMD目录为:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>
想去D盘的 build\zlib1-1.2.11 那就 cd /d d:\build\zlib1-1.2.11
或是 D:<回车> cd zlib1-1.2.11 效果相同。不过 cd /d 更适用于参数传递,
比如 set ZLIB_SRC=%CD%
cd /d %zlib_src%
开始编译,win键+R,打开运行框,或是右键开始 运行,输入 cmd <回车> 注意,直到编译完成,这个窗口最好不要关,因为该文章是连续的。
一 编译zlib,假设zlib源码在 D:\build\zlib1-1.2.11 编译后的文件在 D:\build\bin D:\build\include D:\build\lib
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
cd /d D:\build\zlib1-1.2.11
nmake /f win32\makefile.msc
mkdir ..\bin ..\include ..\lib
copy *.dll ..\bin
copy zlib.h ..\include
copy zconf.h ..\include
copy *.lib ..\lib
二 继续编译bzip2,假设bzip2源码在 D:\build\bzip2-1.0.6 编译后的文件在 D:\build\bin D:\build\include D:\build\lib
cd ..\bzip2-1.0.6 或 cd /d D:\build\bzip2-1.0.6
nmake /f makefile.msc
copy bzlib.h ..\include
copy *.lib ..\lib
三 继续 libiconv 和 libintl, 假设源码在 D:\build\libiconv-1.15 D:\build\libintl-0.19.8.1 编译后的文件在 D:\build\bin D:\build\include D:\build\lib
cd /d D:\build\libiconv-1.15
nmake /f Makefile.mak DLL=1
copy *.dll ..\bin
copy iconv.h ..\include
copy *.lib ..\lib
cd /d D:\build\libintl-0.19.8.1
nmake /f Makefile.mak DLL=1
copy *.dll ..\bin
copy libgnuintl.h.in ..\include\libintl.h
copy *.lib ..\lib
四 接下来编译 pcre,pcre需要 cmake 假设源码在 D:\build\pcre-8.42 编译后的文件在 D:\build\bin D:\build\include D:\build\lib
cd /d D:\build
set SRC_PATH=pcre-8.42
set CMK_PATH=pcre-8.42-vc2017
set INS_PATH=D:\build\pcre
set PATH=%PATH%;D:\build\bin
set INCLUDE=%INCLUDE%;D:\build\include
set LIB=%LIB%;D:\build\lib
mkdir %CMK_PATH%
cd %CMK_PATH%
D:\platform\cmake\bin\cmake.exe -G "NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=MinSizeRel ^
-DCMAKE_INSTALL_PREFIX="%INS_PATH%\shared" ^
-DBUILD_SHARED_LIBS=1 ^
-DINSTALL_MSVC_PDB=1 ^
-DPCRE_BUILD_PCRE16=1 ^
-DPCRE_BUILD_PCRE32=1 ^
-DPCRE_BUILD_PCRE8=1 ^
-DPCRE_BUILD_PCRECPP=1 ^
-DPCRE_BUILD_PCREGREP=1 ^
-DPCRE_BUILD_TESTS=0 ^
-DPCRE_EBCDIC=0 ^
-DPCRE_EBCDIC_NL25=0 ^
-DPCRE_NEWLINE=ANYCRLF ^
-DPCRE_SUPPORT_BSR_ANYCRLF=1 ^
-DPCRE_SUPPORT_JIT=1 ^
-DPCRE_SUPPORT_LIBBZ2=1 ^
-DPCRE_SUPPORT_LIBZ=1 ^
-DPCRE_SUPPORT_PCREGREP_JIT=0 ^
-DPCRE_SUPPORT_UNICODE_PROPERTIES=1 ^
-DPCRE_SUPPORT_UTF=1 ^
..\%SRC_PATH%
cmake 在搜索zlib时,会首先找到 zlib.lib 这是zlib的静态库。其实无所谓,如果你想链接动态库,编辑 D:\build\pcre-8.42-vc2017 目录下刚才生成的 CMakeCache.txt ,查找 zlib.lib 替换成 zdll.lib
如果你想用批处理来做这件事,请下载gnuwin32 的 sed 地址:
http://sourceforge.net/projects/gnuwin32/files//sed/4.2.1/sed-4.2.1-bin.zip/download
http://sourceforge.net/projects/gnuwin32/files//sed/4.2.1/sed-4.2.1-dep.zip/download
全部解压后放到 C:\gnuwin32, 这个位置最好,为什么最好呢,因为 GnuWin32 的一些工具,举例说bison,在执行某些操作时,默认会搜索C:\gnuwin32\share这个目录,比如:C:\gnuwin32\share\bison\m4sugar\m4sugar.m4 这在编译PHP时,要处理PHP源码,会用到,如果放在别的位置,会报错找不到该文件。编译QT时也会用到bison,QT自带了一个修正版本的bison,网上也有其他修正的版本,不存在这样的提示,但是你需要单独搜索下载、尝试,其他的一些Gnu工具也会有这样或那样的问题,我们上个班、学个习不是给自己找麻烦的是吧?
接下来设置 sed的目录,
set PATH=%PATH%;C:\gnuwin32\bin
确定当前在 D:\build\pcre-8.42-vc2017 目录下:
sed -i "s/zlib.lib/zdll.lib/g" CMakeCache.txt
nmake
nmake install
pcre的动态版本会安装到 D:\build\pcre\shared 目录下。然后编译静态版本,首先删除上次的编译目录,再新建一个,免得污染:
cd ..
rd /s /q %CMK_PATH%
mkdir %CMK_PATH%
cd %CMK_PATH%
D:\platform\cmake\bin\cmake.exe -G "NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=MinSizeRel ^
-DCMAKE_INSTALL_PREFIX="%INS_PATH%\static" ^
-DBUILD_SHARED_LIBS=0 ^
-DINSTALL_MSVC_PDB=1 ^
-DPCRE_BUILD_PCRE16=1 ^
-DPCRE_BUILD_PCRE32=1 ^
-DPCRE_BUILD_PCRE8=1 ^
-DPCRE_BUILD_PCRECPP=1 ^
-DPCRE_BUILD_PCREGREP=1 ^
-DPCRE_BUILD_TESTS=0 ^
-DPCRE_EBCDIC=0 ^
-DPCRE_EBCDIC_NL25=0 ^
-DPCRE_NEWLINE=ANYCRLF ^
-DPCRE_SUPPORT_BSR_ANYCRLF=1 ^
-DPCRE_SUPPORT_JIT=1 ^
-DPCRE_SUPPORT_LIBBZ2=1 ^
-DPCRE_SUPPORT_LIBZ=1 ^
-DPCRE_SUPPORT_PCREGREP_JIT=0 ^
-DPCRE_SUPPORT_UNICODE_PROPERTIES=1 ^
-DPCRE_SUPPORT_UTF=1 ^
..\%SRC_PATH%
这里,刚才编译动态库时,搜索的是Zlib的静态库zlib.lib,现在这里没问题了,但是新的问题出现了,如果你的bzip2用的是我上面提供的地址下载的,能生成bzip2.dll版本的源码,cmake 在搜索 bzip2时,首先会找到 bzip2.lib,真讨厌,这个bzip2.lib 是导入库,搞什么嘛。我们需要让他使用静态库:
sed -i "s/bzip2.lib/libbz2.lib/g" CMakeCache.txt
nmake
nmake install
pcre的静态版本会安装到 D:\build\pcre\static 目录下。
现在,终于可以编译Glib了,呃,在编译之前,还需要做最后的准备,还没完事呢。。。。。。
五 准备 glib源码,假设源码在 D:\build\glib-2.58.0,编译glib需要meson,meson是什么玩意?这里就不多介绍了*_^,总之是一个基于python的编译系统,首先设置一些变量,安装一些必须的配件,官方的python包里,应该是包含pip的,这是一个python的包管理工具,用来安装python包:
set PYTHONPATH=D:\platform\python3
set PATH=%PATH%;%PYTHONPATH%;%PYTHONPATH%\Scripts\
pip install meson ninja
meson相当于配置 configure ,ninja相当于make
如果你的 pip 不能正常工作,提示 pip 需要 up-to-date,那么需要在cmd中执行:
python -m pip install -U pip
先更新 pip
如果你根本就没有pip,那么需要 下载 https://bootstrap.pypa.io/get-pip.py 这个文件,在终端执行:
python get-pip.py
这个脚本会下载 pip setuptools wheel 三个包。然后执行:
pip install meson ninja
现在meson ninja,已经安装完成,至此,编译工具齐备。
然后准备glib源码:
glib需要 libffi,pcre, intl, zlib,现在后三个我们全编译完成了,libffi会在编译glib的同时编译,首先要下载libffi的源码:
在 D:\build\glib-2.58.0\subprojects\ 目录下,会找到三个wrap文件,用文本编辑工具打开 libffi.wrap 看到 glib 推荐我们去:
https://github.com/centricular/libffi.git 这个位置下载 libffi的源码,打开这个网址,页面右方有一个 Clone or download 的绿色按钮,点一下,然后 Download ZIP,下载回来的文件解压缩为 libffi-meson 重命名为 libffi 然后放到 glib-2.58.0\subprojects\下。
为什么重命名,wrap文件中就这么写的啊。directory=libffi 看到没?另二个wrap请忽略,我试了,没〇用。你下回来改名,根目录下有meson.build文件,meson也没看见。
然后到 glib-2.58.0\build\win32\dirent 中,有 二个c文件和一个h文件,请复制到 glib-2.58.0\glib 目录下,如果你不复制,那么在编译 glib-2.58.0\glib\gdir.c 时,会提示找不到dirent.h文件,或者_WDIR 未定义,或者无法解析的外部符号,三种情况我都遇到了,更多的情形不清楚。
现在,文件复制完成了,但是meson 还找不到这三个文件,不编译他们,需要修改glib-2.58.0\glib\meson.build 文件:
glib_sub_headers = files处添加:
glib_sub_headers = files(
'dirent.h',
glib_sources = files处添加:
glib_sources = files(
'dirent.c',
'wdirent.c',
现在,glib的源码准备完成。
接下来开始编译,glib用的是pcre的动态库:
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
set PYTHONPATH=D:\platform\python3
set PYTHONHOME=%PYTHONPATH%
set PATH=%PATH%;%PYTHONHOME%;%PYTHONHOME%\Scripts\
set INCLUDE=%INCLUDE%;D:\build\include;D:\build\pcre\shared\include
set LIB=%LIB%;D:\build\lib;D:\build\pcre\shared\lib
cd /d D:\build
mkdir glib-2.58.0-win64-vc141
cd glib-2.58.0-win64-vc141
meson.py ..\glib-2.58.0 --prefix=D:\build\glib --buildtype=minsize --default-library=both
--default-library=both 表示要同时编译动态.dll和静态库.a,不指定只编译.dll。
这里有个注意:如果你的%BIN%目录里有pkgconfig.exe 并且,你%LIB%里有pkgconfig\libffi.pc,在meson时会出错。解决方法是删除那个libffi.pc,或是保证libffi.pc里指定的ffi库真实存在并可用。这个注意只适用于重新编译时的情况。初次编译不会遇到这个问题。
ninja
ninja install
编译完成后,glib就安装到 D:\build\glib 目录下。