需求概述
获得最新版本的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博客