如果用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所需要的工具和依赖库。

# 安装依赖库和必须的工具
pacman --needed --noconfirm -S automake autoconf make libtool unzip glib2-devel intltool pcre-devel   \
            mingw-w64-x86_64-toolchain mingw-w64-x86_64-pcre

# 可选工具用于生成文档
#pacman --needed --noconfirm -S gtk-doc

下载glib

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

编译

cd glib-2.54.3
# 第一次要执行autogen.sh才会生成./configure,后续可以直接执行./configure来修改编译配置
./autogen.sh --prefix=/your/install/path
# 编译并安装到prefix指定的位置
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的代码:

glib-2.0.lib: libglib-2.0.la glib.def
    $(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:

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

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

glib-2.54.3-x86_64
  ├── bin
  │   ├── gdbus.exe
  │   ├── gdbus-codegen
  │   ├── gio.exe
  │   ├── gio-querymodules.exe
  │   ├── glib-compile-resources.exe
  │   ├── glib-compile-schemas.exe
  │   ├── glib-genmarshal
  │   ├── glib-gettextize
  │   ├── glib-mkenums
  │   ├── gobject-query.exe
  │   ├── gresource.exe
  │   ├── gsettings.exe
  │   ├── gspawn-win64-helper.exe
  │   ├── gspawn-win64-helper-console.exe
  │   ├── libgio-2.0-0.dll
  │   ├── libglib-2.0-0.dll
  │   ├── libgmodule-2.0-0.dll
  │   ├── libgobject-2.0-0.dll
  │   └── libgthread-2.0-0.dll
  ├── include
  │   ├── gio-win32-2.0
  │   └── glib-2.0
  ├── lib
  │   ├── charset.alias
  │   ├── gio
  │   ├── gio-2.0.lib
  │   ├── glib-2.0
  │   ├── glib-2.0.lib
  │   ├── gmodule-2.0.lib
  │   ├── gobject-2.0.lib
  │   ├── gthread-2.0.def
  │   ├── gthread-2.0.lib
  │   ├── libgio-2.0.dll.a
  │   ├── libgio-2.0.la
  │   ├── libglib-2.0.dll.a
  │   ├── libglib-2.0.la
  │   ├── libgmodule-2.0.dll.a
  │   ├── libgmodule-2.0.la
  │   ├── libgobject-2.0.dll.a
  │   ├── libgobject-2.0.la
  │   ├── libgthread-2.0.dll.a
  │   ├── libgthread-2.0.la
  │   └── pkgconfig
  └── share
      ├── aclocal
      ├── bash-completion
      ├── gdb
      ├── gettext
      ├── glib-2.0
      └── 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》

glib:windows下基于MSYS2环境编译glib2的过程的更多相关文章

  1. .dylib在Debug中链接,在XCode中找不到适用于iPhone的版本

    所以我已经将libxml2.2.dylib库包含在我的iPhoneXCode项目中,以创建一些Xml和XPath解析实用程序.当我编译并运行在模拟器和设备的调试模式时,我没有问题,但是,当我切换到发布模式我得到…

  2. 在编译的iOS应用程序(IPA)中加密内容

    由于IPA结构只是一个压缩文件,包含编译代码媒体内容,如图像&音频,我如何保护内容免受别人的窃取?是否有加密可以添加到IPA?

  3. ios – Swift 4向后兼容性

    一起使用.有没有办法在两个版本的Xcode中使这个工作?Swift4是否应该向后兼容?

  4. Swift与OC混合编译

    SWift调用OC新建swift文件此时系统自动生成-Bridging-Header.h文件并且TARGETS->BuildSettings->Objective-CBridgingHeader(搜索bridg)选项中会自动填入以上头文件的路径在-Bridging-Header.h中#import要调用的OC对象头文件OC调用Swift在OC文件中#import“

  5. Swift教程01-使用switfc终端命令编译运行swift程序

    应公司的要求,要我研究swift语言,然后给大家进行swift技术培训,买了4,5本swift相关的书籍就开始研究了.今天来介绍一下,swift相关的终端的命令.1.首先我们在桌面上建一个swift文件夹用来存放.swift源文件,打开终端输入cd加空格拖拽文件夹到终端(使用命令ls,cd目录也是等效)3.使用vi命令创建一个HelloWorld.swift源文件进入swift文件夹后,然后使用如

  6. 驳狗屎文 "我为什么放弃Go语言"

    开门见山地说,我当初放弃Go语言,就是因为两个“不爽”:第一,对Go语言本身不爽;第二,对Go语言社区里的某些人不爽。两年之后,2011年底,Go语言发布1.0的计划被提上日程,相关的报道又多起来,我再次关注它,重新评估之后决定深入参与Go语言。外加Go语言社区里的某些人,其中也包括Google公司负责开发Go语言的某些人,其态度、言行,让我极度厌恶,促使我决绝地离弃Go语言。第1节:我为什么对Go语言不爽?

  7. Swift语法特点

    从它的语法中能看到Ojective-CJavaScriptC#Python等语言的影子swift借鉴了以上几门语言的特点我们可以从swift身上看到这几种语言的影子同时还具备了编译型语言额高能性和脚本语言的灵活交互性OC-C#都是编译型的语言也就是我们写完代码要保证每一行代码编译通过才能跑起来这叫编译型语言一般编译型的语言性能比较高能做的事情比较强大比如说OC能开发手机程序C#能开发服务器程序脚本

  8. Swift思量与初探:我需要学习Swift吗?

    最近,除了N多的基于Swift的服务端开发框架,笔者不由深思,到底该这么评价Swift呢?前两点在Swift的语法和语言特性中已经表现得淋漓尽致:像是尾随闭包,枚举关联值,可选值和强制的类型安全等都是Swift显而易见的优点。综上所述,Swift拥有着被广泛使用以及当做第一学习语言的潜质。Swift在语法层次上会更加高级,并且Swift并没有使用GC机制,因此可以与C更好地相兼容。Swift中的注释与C语言的注释非常相似。

  9. Swift 2 throws 全解析 - 从原理到实践

    Swift2错误处理简介throws关键字和异常处理机制是Swift2中新加入的重要特性。为了解决这个问题,Swift2中在编译器层级就对throws进行了限定。在Swift开源之前,将源码编译到各个阶段是探索Swift原理和实现方式的重要方式。事实上NSError在Swift2中也实现了ErrorType接口,它简单地返回错误的域和错误代码信息,这是Swift1到2的错误处理相关API转换的兼容性的保证。throws的一些实践异步操作中的异常处理带有throw的方法现在只能工作在同步API中,这受限于异

  10. 制作一个可以滑动操作的 Table View Cell

    本教程将会向你展示如何制作一个这样的TableViewCell,而不用因嵌套的ScrollView陷入困境。如果你还不知道一个可滑动的TableViewCell意味着什么,那么看看Apple的邮件应用:可能你会想,既然Apple展示了这种方案,那它应该已将其开放给开发者使用了。这会要求你深入研究iOS7UITableViewCell的结构,以便复制出我们需要的行为。打开MasterViewController.m并找到viewDidLoad。这个循环添加了一些字符串到_objects数组,应用运行时,这些

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部