vs2015编译GLib2-5.7

编译glib2.57,一共要编译glib,gio,gmodule,gobject,gthread五个模块
首先1】
将config.h.win32更改名字为config.h
将glibconfig.h.win32更改名字为glibconfig.h
其实编译时他们也会会生成config.h和glibconfig.h。
记得删掉移除掉config.h.win32和glibconfig.h.win32,然后添加头文件config.h和glibconfig.h

其次2】
添加以下的库头文件目录和链接库目录,和链接库名称:
libintl库(该库依赖libiconv)
libffi 库:
pcre 库:主要是要注意添加预处理器定义
zlib 库:

1】、
1>..\..\glib\gversion.c(144): error C2065: “GLIB_INTERFACE_AGE”: 未声明的标识符
1>..\..\glib\gversion.c(144): error C2099: 初始值设定项不是常量
1>..\..\glib\gversion.c(145): error C2065: “GLIB_BINARY_AGE”: 未声明的标识符
1>..\..\glib\gversion.c(145): error C2099: 初始值设定项不是常量
1>..\..\glib\gversion.c(187): error C2065: “GLIB_BINARY_AGE”: 未声明的标识符
fatal error C1189: #error:  "config.h must be included prior to glibintl.h" (编译源文件 ..\..\glib\gutils.c)

统一解决:
附加包含目录中,添加config.h位置。
glib属性页-》配置属性--》C/C++ --》常规 -》附加包含目录--》E:\glib-2.57.1;

2】
1>  gbookmarkfile.c
1>..\..\glib\gbookmarkfile.c : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>..\..\glib\gbookmarkfile.c(754): error C2001: 常量中有换行符
1>..\..\glib\gbookmarkfile.c(755): error C2146: 语法错误: 缺少“)”(在标识符“attr”的前面)
1>..\..\glib\gbookmarkfile.c(756): error C2059: 语法错误:“)”
1>..\..\glib\gbookmarkfile.c(1036): error C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>..\..\glib\gbookmarkfile.c(1148): error C2001: 常量中有换行符

3】fatal error C1083: 无法打开包括文件: libintl.h”: No such file or directory 
#include <libintl.h> 更改为#include <libgnuintl.h> 

4】fatal error C1083: 无法打开包括文件: glibconfig.h”: No such file or directory
glib属性页-》配置属性--》C/C++ --》常规 -》附加包含目录--》E:\glib-2.57.1\glib;

5】
 error C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>..\..\glib\gregex.c(2504): error C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>..\..\glib\gregex.c(2582): error C2001: 常量中有换行符
1>..\..\glib\gbookmarkfile.c(754): error C2001: 常量中有换行符
1>..\..\glib\gbookmarkfile.c(756): error C4002: “_”宏的实参太多
1>..\..\glib\gbookmarkfile.c(756): error C2146: 语法错误: 缺少“)”
主要是编码的问题。
将该文件记事本打开,另存为unicode,保存。
或者使用notepad++打开,编码--》转为UTF-8-BOM编码,保存。
返回到vs2015后,有提示,选择“是”,或者“全是”

6】编译gobject库的时候libffi的问题。
1>    正在创建库 E:\glib-2.57.1\win32\vs14\Release\Win32\bin\gobject-2.0.lib 和对象 E:\glib-2.57.1\win32\vs14\Release\Win32\bin\gobject-2.0.exp
1>gclosure.obj : error LNK2001: 无法解析的外部符号 __imp__ffi_type_double
1>gclosure.obj : error LNK2001: 无法解析的外部符号 __imp__ffi_type_float
1>gclosure.obj : error LNK2001: 无法解析的外部符号 __imp__ffi_type_uint32
1>gclosure.obj : error LNK2001: 无法解析的外部符号 __imp__ffi_type_sint64
1>gclosure.obj : error LNK2001: 无法解析的外部符号 __imp__ffi_type_uint64
1>gclosure.obj : error LNK2001: 无法解析的外部符号 __imp__ffi_type_pointer
1>gclosure.obj : error LNK2001: 无法解析的外部符号 __imp__ffi_type_sint32
1>gclosure.obj : error LNK2001: 无法解析的外部符号 __imp__ffi_type_void
1>E:\glib-2.57.1\win32\vs14\Release\Win32\bin\gobject-2.0-0.dll : fatal error LNK1120: 8 个无法解析的外部命令
其实是libffi.lib没有正确生成的原因。
通过查看ffi.h可以看到
#if defined _MSC_VER && !defined FFI_BUILDING
#define FFI_EXTERN extern __declspec(dllimport)
#else
#define FFI_EXTERN extern
#endif
修改为
#ifndef FFI_EXTERN_EXPORT
#define FFI_EXTERN  __declspec(dllimport)
#else
#define FFI_EXTERN  __declspec(dllexport)
#endif
需要在libffi工程中添上“宏处理器定义”:FFI_EXTERN_EXPORT
然后就可以正常生成静态库了。

7】
2>  gclosure.c
2>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1925): warning C4005: “snprintf”: 宏重定义 (编译源文件 ..\..\gobject\gbinding.c)
2>  E:\glib-2.57.1\config.h(398): note: 参见“snprintf”的前一个定义 (编译源文件 ..\..\gobject\gbinding.c)
2>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1927): fatal error C1189: #error:  Macro definition of snprintf conflicts with Standard Library function declaration (编译源文件 ..\..\gobject\gbinding.c)
1>    正在创建库 E:\glib-2.57.1\win32\vs14\Release\Win32\bin\gmodule-2.0.lib 和对象 E:\glib-2.57.1\win32\vs14\Release\Win32\bin\gmodule-2.0.exp
因为VS2015已经定义了snprintf(),代码中不应该再重复定义,找到snprintf()的定义
这里是/glib-2.57.1/config.h,如下所示,注释掉再重新编译就可以了。
//#if defined (_MSC_VER) && (_MSC_VER < 1900)
//# define snprintf _snprintf
//#endif

8】如果是Release_BundledPCRE或者debug_BundledPCRE
 fatal error C1189: #error:  LINK_SIZE must be either 2, 3, or 4 
解决:其实config.h已经定义了。
所以,需要在pcre_internal.h中添加  
#include "config.h" 

1>  localcharset.c
1>    正在创建库 E:\glib-2.57.1\win32\vs14\Release\Win32\bin\glib-2.0.lib 和对象 E:\glib-2.57.1\win32\vs14\Release\Win32\bin\glib-2.0.exp
1>pcre_study.obj : error LNK2001: 无法解析的外部符号 __pcre_ucd_caseless_sets
不知道怎么解决,放弃这种操作。

9】让pcre支持utf8
或者说“GLib-GRITCAL **:PCRE library is compiled without UTF8 properties support。”
pcre工程中添加预处理器定义:SUPPORT_UTF
重新编译。

完整的工程下载地址:https://download.csdn.net/download/caokunchao/10582579

猜你喜欢

转载自blog.csdn.net/caokunchao/article/details/81276475