glib:windows下基于MSYS2环境编译glib2的过程

小灰灰 2022-05-24 05:51 406阅读 0赞

如果用MSVC编译开源库实在是麻烦,主要的麻烦在于第三方的开源库本身还需要一些依赖库,这些依赖库在windows多数并不提供编译好的二进制版本,所以要先编译安装各种依赖库,比如glib。
我也曾想用官方提供的二进制库(http://ftp.gnome.org/pub/gnome/binaries/win64/glib/),但官方的服务器上从2010年以后就不再提供二进制版本,只提供源码。所以如果要用glib的新版本,只能自己编译,glib github上也有用MSVC编译glib的说明(参见《Compiling the GTK+ (and Clutter) stack using Visual C++ 2008 and later》),但前提就是要提供依赖库(pcre,intltool),想想都麻烦。在网上反复找了很多次,找到这篇官方的说明《Download for Windows》,在这个说明中我只得到一个信息:windows下编译gtk+ (包括glib)最容易的方式就是在MSYS2。MSYS2为windows提供了一个类似unix的开发环境,在这个环境下,安装各种依赖库那都不是事儿。
对MSYS2我还是比较熟悉的,既然官方的建议也是在MSYS,那就在MSYS2下搞吧,MSYS2安装很简单,网上有教程,请自行百度。

安装依赖库

有了MSYS2安装依赖库就非常简单了,以下是通过pacman安装所有编译glib所需要的工具和依赖库。

  1. # 安装依赖库和必须的工具
  2. pacman --needed --noconfirm -S automake autoconf make libtool unzip glib2-devel intltool pcre-devel \
  3. mingw-w64-x86_64-toolchain mingw-w64-x86_64-pcre
  4. # 可选工具用于生成文档
  5. #pacman --needed --noconfirm -S gtk-doc

下载glib

  1. # 从github上下载2.54.3版本的源码
  2. wget https://github.com/GNOME/glib/archive/2.54.3.zip -O glib-2.54.3.zip
  3. # 源码解压缩
  4. unzip glib-2.54.3.zip || exit -1

编译

  1. cd glib-2.54.3
  2. # 第一次要执行autogen.sh才会生成./configure,后续可以直接执行./configure来修改编译配置
  3. ./autogen.sh --prefix=/your/install/path
  4. # 编译并安装到prefix指定的位置
  5. make install -j8

生成MSVC import library (.lib)

问题来了,在MSYS2下编译用的是MinGW编译器,生成的导入库(import library)都后缀是.dll.a,MSVC怎么使用呢?其实MinGW生成的import library,MSVC是可以直接用的,直接添加到msvc工程就可以。
但如果你是用cmake来组织项目,在MSVC编译环境下cmake的find_library是找不到后缀为.dll.a的import library.
怎么办呢?
其实glib的Makefile是支持在编译时生成MSVC的 .lib .def文件的。随便打开一个glib的Makefile(比如glib/Makefile),就可以找到生成.lib的代码:

  1. glib-2.0.lib: libglib-2.0.la glib.def
  2. $(AM_V_GEN) lib.exe -machine:X64 -name:libglib-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(builddir)/glib.def -out:$@

可以看到Makefile生成 .lib 是调用MSVC的lib.exe(在MSVC bin文件夹下)程序来完成的。而默认情况下,MSYS2环境中搜索路径($PATH)中没有MSVC编译器的安装位置(bin).所以这一条命令不能执行,不能生成lib。
解决的办法就是执行编译之前将MSVC 编译器的安装位置(bin)加入$PATH:

  1. # 以Visual Studio 2015为例
  2. PATH="/C/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin":$PATH

make install安装后的目录结构.dll.a.lib都有了。

  1. glib-2.54.3-x86_64
  2. ├── bin
  3. ├── gdbus.exe
  4. ├── gdbus-codegen
  5. ├── gio.exe
  6. ├── gio-querymodules.exe
  7. ├── glib-compile-resources.exe
  8. ├── glib-compile-schemas.exe
  9. ├── glib-genmarshal
  10. ├── glib-gettextize
  11. ├── glib-mkenums
  12. ├── gobject-query.exe
  13. ├── gresource.exe
  14. ├── gsettings.exe
  15. ├── gspawn-win64-helper.exe
  16. ├── gspawn-win64-helper-console.exe
  17. ├── libgio-2.0-0.dll
  18. ├── libglib-2.0-0.dll
  19. ├── libgmodule-2.0-0.dll
  20. ├── libgobject-2.0-0.dll
  21. └── libgthread-2.0-0.dll
  22. ├── include
  23. ├── gio-win32-2.0
  24. └── glib-2.0
  25. ├── lib
  26. ├── charset.alias
  27. ├── gio
  28. ├── gio-2.0.lib
  29. ├── glib-2.0
  30. ├── glib-2.0.lib
  31. ├── gmodule-2.0.lib
  32. ├── gobject-2.0.lib
  33. ├── gthread-2.0.def
  34. ├── gthread-2.0.lib
  35. ├── libgio-2.0.dll.a
  36. ├── libgio-2.0.la
  37. ├── libglib-2.0.dll.a
  38. ├── libglib-2.0.la
  39. ├── libgmodule-2.0.dll.a
  40. ├── libgmodule-2.0.la
  41. ├── libgobject-2.0.dll.a
  42. ├── libgobject-2.0.la
  43. ├── libgthread-2.0.dll.a
  44. ├── libgthread-2.0.la
  45. └── pkgconfig
  46. └── share
  47. ├── aclocal
  48. ├── bash-completion
  49. ├── gdb
  50. ├── gettext
  51. ├── glib-2.0
  52. └── locale

整个安装、下载、编译过程的完整脚本的gitee仓库位置:
https://gitee.com/l0km/faceapi/blob/master/faceapi-rpc-cpp/dependencies/msys2-build-glib.sh

参考资料

《Compiling the GTK+ (and Clutter) stack using Visual C++ 2008 and later》
《Download for Windows》

发表评论

表情:
评论列表 (有 0 条评论,406人围观)

还没有评论,来说两句吧...

相关阅读

    相关 msys2重装

    参考,[这里][Link 1]解决密钥 [这里][Link 2],这里下载基本. [这里下载最新的msys32][msys32] 再试试能不能安装`yay`,`pa