vs2015编译GLib2-5.7

10 篇文章 0 订阅
10 篇文章 0 订阅

编译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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GNU libiconv-1.15和libintl-0.19.8.1,VS2015工程和 Makefile 命令行编译文件 CSDN-tags: libiconv1.15 libintl 0.19.8.1 VS2015 Makefile 声明: 代码为本人良心制作,虽然花费了一定的时间和精力,但不保证完全没有错误。如果您下载并使用了本代码,将其包含在您发布的应用中,给您带来了经济上,心理上,生活上的损失,本人不负有责任。 所有代码都基于官网进行修改,iconv的代码来源于libiconv-1.15的lib目录,intl的代码来源于gettext-runtime的intl目录。 intl需要iconv的支持,如果想单独编译不需要iconv的intl, 请自行修改intl目录下的config.h文件, /* Define if you have the iconv() function and it works. */ #define HAVE_ICONV 1 /* Define to 1 if you have the header file. */ #define HAVE_ICONV_H 1 为: /* Define if you have the iconv() function and it works. */ /* #undef HAVE_ICONV */ /* Define to 1 if you have the header file. */ /* #undef HAVE_ICONV_H */ 并修改VS工程中预处理器定义,删掉/DDEPENDS_ON_LIBICONV=1 VS的工程为VS2015的工程文件,使用VC140工具集,如果没有2015,也可以用Makefile.mak文件来编译。 nmake /f Makefile.mak [DLL] [DEBUG] 指定 DLL=1 编译dll版本,默认是lib版本,libiconv.lib , libintl.lib。 指定 DEBUG=1 编译debug版本,默认是release版本。 同理,如果intl不需要iconv,请修改上面的配置文件选项,并, 删掉Makefile.mak中/DDEPENDS_ON_LIBICONV=1 配置文件的制作,参考了以下几处,修改的大概原则是,能定义的全定义了,就这样: https://github.com/kahrl/gettext-msvc 这个地址提供了libiconv和libintl的VS工程和配置文件。 https://github.com/winlibs 为编译PHP而修改的libiconv和libintl源码,libiconv是最新1.15版本,gettext不是。 附带的Cygwin目录中的工具 libiconv官方的制作文档,用cygwin配合VC,生成的配置文件。 一大堆的宏和函数搞得我头晕脑涨。所以配置文件如果有错误,也在所难免,所有修改的文件,如config.h,iconv.h,libintl.h都附带了原始文件。 如: 配置文件 原始文件 DLL原始文件 LIB原始文件 config.h config.h.in iconv.h iconv.h.build.in iconv.h.in localcharset.h localcharset.h.build.in localcharset.h.in libgnuintl.h libgnuintl.in.h 欢迎同学们下载测试。有问题可以给我发邮件travel981cn@139.com
GNU libiconv-1.15和libintl-0.19.8.1,VS2017工程和 Makefile.mak 命令行编译文件 CSDN-tags: libiconv1.15 libintl-0.19.8.1 VS2017 SDK17134.12 声明: 最新版,修正了relocatable.c文件中GetModuleFileName函数的问题。在ANSI下,等同于:GetModuleFileNameA;Unicode下等同于:GetModuleFileNameW,如果你的程序出错,请检查。 代码为本人良心制作,虽然花费了一定的时间和精力,但不保证完全没有错误。如果您下载并使用了本代码,将其包含在您发布的应用中,给您带来了经济上,心理上,生活上的损失,本人不负有责任。 所有代码都基于官网进行修改,iconv的代码来源于libiconv-1.15的lib目录,intl的代码来源于gettext-runtime的intl目录。 intl需要iconv的支持,如果想单独编译不需要iconv的intl, 请自行修改intl目录下的config.h文件, /* Define if you have the iconv() function and it works. */ #define HAVE_ICONV 1 /* Define to 1 if you have the header file. */ #define HAVE_ICONV_H 1 为: /* Define if you have the iconv() function and it works. */ /* #undef HAVE_ICONV */ /* Define to 1 if you have the header file. */ /* #undef HAVE_ICONV_H */ 并修改VS工程中预处理器定义,删掉/DDEPENDS_ON_LIBICONV=1 VS的工程为VS2017的工程文件,使用VC141工具集,SDK10.0.17134.12,如果没有2017,也可以用Makefile.mak文件来编译。 或者你自己降低版本,我最初使用的最低版本是VC140_xp,SDK7.1A,也就是VS2015默认安装的兼容xp工具集,VS2015以下版本未测试。 nmake /f Makefile.mak [DLL] [DEBUG] 指定 DLL=1 编译dll版本,默认是lib版本,libiconv.lib , libintl.lib。 指定 DEBUG=1 编译debug版本,默认是release版本。 同理,如果intl不需要iconv,请修改上面的配置文件选项,并, 删掉Makefile.mak中/DDEPENDS_ON_LIBICONV=1 配置文件的制作,参考了以下几处,修改的大概原则是,能定义的全定义了,就这样: https://github.com/kahrl/gettext-msvc 这个地址提供了libiconv和libintl的VS工程和配置文件。 https://github.com/winlibs 为编译PHP而修改的libiconv和libintl源码。 附带的Cygwin目录中的工具 libiconv官方的制作文档,用cygwin配合VC,生成的配置文件。 一大堆的宏和函数搞得我头晕脑涨。所以配置文件如果有错误,也在所难免,所有修改的文件,如config.h,iconv.h,libintl.h都附带了原始文件。 如: 配置文件 原始文件 DLL原始文件 LIB原始文件 config.h config.h.in iconv.h iconv.h.build.in iconv.h.in localcharset.h localcharset.h.build.in localcharset.h.in libintl.h libgnuintl.in.h 欢迎同学们下载测试。有问题可以给我发邮件travel981cn@139.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charles技术成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值