VS2017编译glib-2.58.0

已编译好的代码下载: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 目录下。

你可能感兴趣的:(VS2017编译glib-2.58.0)