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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/19340.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis缓存

就先不连接数据库了 我们测试缓存 实体类: Data AllArgsConstructor NoArgsConstructor public class User implements Serializable {private int id;private String name;private String sex;private String addr; } service: Service public…

小家电LED显示驱动多功能语音芯片IC方案 WT2003H4 B002

随着时代的进步,智能家电的普及已经成为了一个趋势。而在智能家电中,LED显示屏也成为了不可或缺的一部分。因此,在小家电的设计中,LED显示驱动芯片的应用也越来越广泛。比如:电饭煲、电磁炉、数字时钟、咖啡机、电磁炉…

java版spring cloud 企业电子招投标采购系统源码之首页设计

随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要…

“正大杯”第十三届市场调查与分析大赛[省一]经验总结+复盘

目录 1 前期组队 2 队员组成 队长-成员1 应用统计学专业 成员2 化学实验专业 成员3-本人 物联网工程专业 成员4 金融ACCA专业 成员5 应用物理学 总结 3 比赛进度 3月中旬 部分图表的制作 问卷设计与制作 稍微改动主题 问卷相关总结 前期调查部分论文框架 3月…

怎么把webp文件转换为jpg?这几种方法值得学习!

怎么把webp文件转换为jpg,我想这样的问题对于那些和图片打交道不多的人来说确实有些困难吧。在我们要处理这个问题之前,我们先来了解一下图片格式webp吧。要是知道Youtube、Gmail、Google Play 中都可以看到 WebP 的身影,而 Chrome 网上商店甚…

高阶python | 堆栈列表:RPN应用(模拟逆波兰式功能实现)

python版本:3.10 在列表中,append和pop方法有一个特殊的用途。可以在列表上使用这两个方法让列表变成一个堆栈使用。 这就是一个栈,它是先进后出,类似单门轿厢电梯一样的设计,出入口共用 堆栈最有用的应用之一就是做逆…

如何解决请求参数为JSON时,采用IO流读取,只能请求一次的问题?

如何解决请求参数为JSON时,采用IO流读取,只能请求一次的问题? 一、错误演示1. 创建项目,添加所需依赖2. 配置redis环境3. 写一个简单的测试请求4. 写一个拦截器,拦截请求5. WebConfig 注册拦截器6. 测试请求 二、问题解…

VR全景园区:数字化旅游业的新未来

VR全景园区是未来数字化旅游业的一种新兴形式。它利用高清晰度的3D图像和360度全景拍摄技术,将景区中的自然风光、历史文化和人文风情等元素呈现在游客面前。VR全景园区不仅可以为游客提供身临其境的参观体验,还可以有效地推广当地的文化和旅游资源。 【…

调试和优化遗留代码

1. 认识调试器 1.1 含义 一个能让程序运行、暂停、然后对进程的状态进行观测甚至修改的工具。 在日常的开发当中使用非常广泛。(PHP开发者以及前端开发者除外) 1.2 常见的调试器 Go语言的自带的 delve 简写为 “dlv”GNU组织提供的 gdbPHP Xdebug前端浏览器debug 调试 1.3…

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五 引言🍉句1: The color green is natural for trees and grass.成分划分弱读语调 🍉句2: But it is an unnatural color for humans.成分划分弱读连读语调 🍉句3: A person who h…

1.SpringBoot基础篇

SpringBoot 文档更新日志 版本更新日期操作描述v1.02021/11/14A基础篇 前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程——SpringBoot。一句话介绍这个技术,…

自学软件测试,从10K到40K的技术路线,也就是这些东西...

如果有一天我从梦中醒来时,发现自己的几年自动化测试工程师经验被抹掉,重新回到了一个小白的状态。我想要重新自学自动化测试,然后找到一份自己满意的测试工作,我想大概只需要6个月的时间就够了,如果比较顺利的话&…

头部企业走入无人区,国产数智化厂商挑大梁

本文转自数智前线 文|石兆 编|游勇 央国企数智化与信创化双重需求叠加,国产厂商挑大梁,助力企业升级数智化底座,实现价值化国产替代。 4月,在北京用友产业园的数智剧院里,近千位来自30个行业…

uniapp实现微信小程序横屏适配问题demo效果(整理)

使用VMIN进行布局 先了解css3的两个属性vmax和vmin vmax 相对于视口的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax vmin 相对于视口的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin竖屏布局的时候,750rpx就是竖屏布局屏幕的宽度…

Golang每日一练(leetDay0062) BST迭代器、地下城游戏

目录 173. 二叉搜索树迭代器 Binary Search Tree Iterator 🌟🌟 174. 地下城游戏 Dungeon Game 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 …

ASEMI代理LT8609AJDDM#WTRPBF原装ADI车规级芯片

编辑:ll ASEMI代理LT8609AJDDM#WTRPBF原装ADI车规级芯片 型号:LT8609AJDDM#WTRPBF 品牌:ADI /亚德诺 封装:DFN-10 批号:2023 安装类型:表面贴装型 引脚数量:10 工作温度:-40C~125C 类型…

python基础语法

一、配置python环境 (1)设置环境变量 path添加 C:\Program Files\Python3_11 C:\Program Files\Python3_11\Scripts (2)了解pip 什么是pip? pip是pyton包管理器,pypi(Python Package Ind…

前端开发之Echarts 图表渐变两种实现方式和动态改变图表类型

前端开发之Echarts 图表渐变两种实现方式 前言效果图一、echarts中存在两种渐变方式1、color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{},{},{}])简单案例 2、{type: linear,x: 0,y: 0,x2: 0,y2: 1, [{},{},{}]}案例 二…

Codeforces Round 872 (Div. 2)

Problem - D2 - Codeforces 思路: 我们设good点到所有k点的距离和为dis。 假设good点不止一个,那么我们good点的dis应该都是相等的(废话)。设当前点u是good点,如果他往儿子v移动,儿子有w个点属于k&#…

怎么把mkv格式改成mp4?不妨试试这几种方法吧!

怎么把mkv格式改成mp4?mp4是一种多媒体封装格式,不过我们通常会将它说成是视频格式,它可以在一个文件中容纳无限数量的视频、音频、图片或字幕轨道,mp4格式也是被我们每个人所熟知,因为我们每个人几乎每天都会接触或者…