VS2022编译libiconv-1.17

需求概述

获得最新版本的windows下可用的libiconv静态库。

解决方案

概述

使用VS2022编译libiconv-1.17。需要对源码手动进行配置。

本文所述的方法同样适用于动态库,并且理论上适用于VS2010~2022所有版本。

如果你不在乎libiconv的版本,可以参考

在Windows下编译iconv_iconv windows-CSDN博客

编译旧版本的,过程会简单很多。

下载libiconv源码

直接从GNU官网下载即可

https://ftp.gnu.org/pub/gnu/libiconv/

解压缩得到文件夹libiconv-1.17,略。

创建工程

 选择静态库,点下一步。如果需要动态库,则选择动态链接库(DLL)。

项目名称和位置无所谓,略。

新建的工程里会有一些预置的h和cpp文件,全都没用可以删。

手动添加文件

1、将libiconv-1.17\lib目录下的relocatable.h、relocatable.c 、iconv.c 三个文件复制到$(ProjectDir)
2、将libiconv-1.17\libcharset\lib\localcharset.c 复制到$(ProjectDir)
3、将libiconv-1.17\libcharset\include\localcharset.h.build.in复制到$(ProjectDir),重命名为localcharset.h
4、在$(ProjectDir)下创建include目录
5、将libiconv-1.17\include\iconv.h.build.in复制到include目录,重命名为iconv.h
6、将libiconv-1.17\config.h.in拷贝到include目录下,重命名为config.h
7、将libiconv-1.17\lib目录下的*.h 和*.def文件拷贝到include目录下
8、将1、2、3步的5个文件添加到工程中,再将include/iconv.h、include/config.h添加到工程中。

$(ProjectDir)表示工程所在目录,在vs配置中设置这个值会自动转化为绝对路径。

 手动配置

1、增加包含目录$(ProjectDir)\include

2、增加预处理器定义 _CRT_SECURE_NO_WARNINGS

3、配置不使用预编译头:

4、修改localcharset.h:

/*修改21-27行
#if @HAVE_VISIBILITY@ && BUILDING_LIBCHARSET
#define LIBCHARSET_DLL_EXPORTED __attribute__((__visibility__("default")))
#elif defined _MSC_VER && BUILDING_LIBCHARSET
#define LIBCHARSET_DLL_EXPORTED __declspec(dllexport)
#else
#define LIBCHARSET_DLL_EXPORTED
#endif
替换为30-36行*/
#ifdef LIBICONV_EXPORTS
#define LIBCHARSET_DLL_EXPORTED __declspec(dllexport)
#elif USING_STATIC_LIBICONV
#define LIBCHARSET_DLL_EXPORTED
#else
#define LIBCHARSET_DLL_EXPORTED __declspec(dllimport)
#endif//第36行

5、修改include/iconv.h:

#define USING_STATIC_LIBICONV 1 //在21行之后添加。动态库不添加这行。
/*在这里定义USING_STATIC_LIBICONV有一个好处和一个坏处。
* 好处是使用静态库时无需再定义USING_STATIC_LIBICONV,坏处是这个头文件只能用于静态库。
* 如果不在这里定义USING_STATIC_LIBICONV,则需要在工程设置里定义,使用时也需要在工程设置里定义。
*/

/**修改25-32行
#if @HAVE_VISIBILITY@ && BUILDING_LIBICONV
#define LIBICONV_DLL_EXPORTED __attribute__((__visibility__("default")))
#elif defined _MSC_VER && BUILDING_LIBICONV
#define LIBICONV_DLL_EXPORTED __declspec(dllexport)
#else
#define LIBICONV_DLL_EXPORTED
#endif
extern LIBICONV_DLL_EXPORTED @DLL_VARIABLE@ int _libiconv_version;
替换为41-48行**/ 
#ifdef LIBICONV_EXPORTS
#define LIBICONV_DLL_EXPORTED __declspec(dllexport)
#elif USING_STATIC_LIBICONV
#define LIBICONV_DLL_EXPORTED
#else
#define LIBICONV_DLL_EXPORTED __declspec(dllimport)
#endif
extern LIBICONV_DLL_EXPORTED int _libiconv_version;//第48行

//extern LIBICONV_DLL_EXPORTED size_t iconv (iconv_t cd, @ICONV_CONST@ char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);//修改第90行
extern LIBICONV_DLL_EXPORTED size_t iconv(iconv_t cd, const char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft);//替换为这行

//去掉第108-180行所有的@

5、修改iconv.c,将所有ICONV_CONST替换为const。

6、修改config.h,注释第28行:

//#undef EILSEQ

编译链接发布

编译链接:直接生成工程即可。

发布:将include/iconv.h和生成的lib文件拷贝到发版目录。

参考资料

Windows下使用VS2019编译libiconv-1.16_vs 2019 iconv.h文件代码编译包_Jerry-ojk的博客-CSDN博客

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值