vs2010编译iconv1.14

代码在github:https://github.com/langresser/iconv1.14-for-vs2010

参考这篇文章:http://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio

摘录如下:

Introduction

Libiconvis one of the most useful and famous libraries that converts texts between encodings and has been developed under GNU projects. However, now it does not provide the way to build it with Microsoft Visual Studio but with gcc. Before, it had provided but now stopped explaining how to build it with Microsoft Visual Studio. However, many of the computer programmers are using Microsoft Visual Studio and want to buildlibiconvwith Microsoft Visual Studio. So, this article is about how to buildlibiconvwith Microsoft Visual Studio. If you can buildlibiconvwith Microsoft Visual Studio, you will be able to change various compilation options and build it in order to optimizelibiconvaccording to your preference and needs.

Background

If you have no idea aboutlibiconv, you can refer to ithereor you can Google for it. You may be confused withiconvandlibiconv.Iconvis the executable program that useslibiconvwhilelibiconvis the library for converting text strings between two different encodings. This article is related tolibiconv. However, this article is not aboutlibiconvbut about how to buildlibiconvwith Microsoft Visual Studio. The GNU librarylibiconvis under LGPL license. So, you have to be really careful when you uselibiconvfor your commercial use or when you don't want to publicize your source code. About LPGL license, you can referhere.

How to Get the Source Code of libiconv

At the moment, the most recent version oflibiconvis 1.14. You can download the source code oflibiconv1.14hereandhere. Of course, you can get the older versions oflibiconvhere.

How to Build

I am going to explain the case of Microsoft Visual Studio 2010 professional edition but the explanation can be applied to the earlier versions of Microsoft Visual Studio and to the express edition of each of them.

First Step

You download the most recent version oflibiconvwhich is 1.14 fromhereorhere. And unzip the downloaded file "libiconv-1.14.tar.gz" on your certain folder.

Second Step

You run your Microsoft Visual Studio. Then, you make a newWIN32project. Let's say "libiconv" as the project name. Check to create directory for solution. Choose DLL as the application type and check Empty project for additional options. Click the button "finish" to generate the new project.

Third Step

Now, you have to copy some files from the folders generated by unzipping "libiconv-1.14.tar.gz" to the project folders. To build "libiconv", you need to compile three files "localcharset.c", "relocatable.c" and "iconv.c". That is the key idea!

Copy three files "relocatable.h", "relocatable.c" and "iconv.c" in the folder "...\libiconv-1.14\lib\" to the project folder "...\libiconv\libiconv\".
Copy "...\libiconv-1.14\libcharset\lib\localcharset.c" to the project folder "...\libiconv\libiconv\".
Copy "...\libiconv-1.14\libcharset\include\localcharset.h.build.in" to the project folder "...\libiconv\libiconv\" and then, rename the copied "localcharset.h.build.in" to "localcharset.h.
Copy "...\libiconv-1.14\windows\libiconv.rc" to the project folder "...\libiconv\libiconv\".

Make folder "include" under the project folder "...\libiconv\" so to make "...\libiconv\include".
Copy "...\libiconv-1.14\include\iconv.h.build.in" to the project include folder "...\libiconv\include" and then, rename the copied "iconv.h.build.in" to "iconv.h".
Copy "...\libiconv-1.14\config.h.in" to the project include folder "...\libiconv\include" and then, rename the copied "config.h.in" to "config.h".
And then, copy all the header files (*.h) and definition files (*.def) in the folder "...\libiconv-1.14\lib" to the project include folder "...\libiconv\include".

Fourth Step

Now, you have to add existing items to the project "libiconv" that we made at the second step. Execute "project > Add Existing items..." at the main menu to add existing items to the project.

Fifth Step

You can make 64-bit platform through configuration manager in order to generatelibiconv.dllfor 64-bit system. You can also make two other configurations "ReleaseStatic" and "DebugStatic" in order to generatelibiconvStatic.libas a static link library.

At the project properties, change Output Directory as "$(SolutionDir)$(Configuration)_$(Platform)\" and Intermediate Directory as "$(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\".

Change Include Directories as "..\include;$(IncludePath)":

You have to add "BUILDING_LIBICONV" and "BUILDING_LIBCHARSET" to Peprocessor Definitions of all Platforms and of all configurations.

You'd better set Runtime Library to "Multi-threaded" when building dynamic link librarylibiconv.dll. Then, the dependency on VC Runtime library can be controlled by the applications that will be built and dynamically linked withlibiconv.dllbecauselibiconv.dlldoes not need VC Runtime library but only the application that useslibiconv.dllmay or may not need VC Runtime library. However, when building thestaticlink librarylibiconvStatic.lib, you can choose Runtime Library option forlibiconvStatic.libdepending on the application that useslibiconvStatic.lib.

You have to change Precompiled Header option to "Not Using Precompiled Headers".

Sixth Step

Now, it is the time to tweak the source code of thelibiconv.

libiconv.rc

Openlibiconv.rcwith text editor or the source code editor of Visual Studio IDE by double-clickinglibiconv.rcin the Solution explorer and insert some code at line 4 as follows:

///// 추가 / ADD / ДОВАВЛЯТЬ //
#define PACKAGE_VERSION_MAJOR       1
#define PACKAGE_VERSION_MINOR       14
#define PACKAGE_VERSION_SUBMINOR    0
#define PACKAGE_VERSION_STRING      "1.14"
////

You may be asked to change Line endings to "Windows (CR LF)". Then, let it do so. It will be more convenient for you if you mainly use Windows.

localcharset.c

Openlocalcharset.cand delete or comment the lines 76 - 79 as follows:

///// 삭제 / DELETE / удалить ///
///* Get LIBDIR.  */
//#ifndef LIBDIR
//# include "configmake.h"
//#endif
////
iconv.c

Openiconv.cand delete or comment the lines 246 - 248 and add three lines there as follows:

///// 삭제 / DELETE / УДАЛИТЬ ///
//size_t iconv (iconv_t icd,
//              ICONV_CONST char* * inbuf, size_t *inbytesleft,
//              char* * outbuf, size_t *outbytesleft)
///// ?? / ADD / ????????? //
size_t iconv (iconv_t icd,
              const char* * inbuf, size_t *inbytesleft,
              char* * outbuf, size_t *outbytesleft)
////
localcharset.h

Openlocalcharset.hand delete or comment the lines 23 - 27 and add 7 lines there as follows:

///// 삭제 / DELETE / УДАЛИТЬ ///
//#if @HAVE_VISIBILITY@ && BUILDING_LIBCHARSET
//#define LIBCHARSET_DLL_EXPORTED __attribute__((__visibility__("default")))
//#else
//#define LIBCHARSET_DLL_EXPORTED
//#endif
///// ?? / ADD / ????????? //
#ifdef BUILDING_LIBCHARSET
#define LIBCHARSET_DLL_EXPORTED __declspec(dllexport)
#elif USING_STATIC_LIBICONV
#define LIBCHARSET_DLL_EXPORTED
#else
#define LIBCHARSET_DLL_EXPORTED __declspec(dllimport)
#endif
////
config.h

Openconfig.hin the project include folder "...\libiconv\include" and delete or comment the lines 29 - 30 as follows:

///// 삭제 / DELETE / УДАЛИТЬ ///
///* Define as good substitute value for EILSEQ. */
//#undef EILSEQ
////

Otherwise you can redefineEILSEQas good substitute value.

iconv.h

Openiconv.hin the project include folder "...\libiconv\include" and delete or comment the line 175 and add 1 line as follows:

///// 삭제 / DELETE / УДАЛИТЬ ///
//#if @HAVE_WCHAR_T@
///// 추가 / ADD / ДОВАВЛЯТЬ //
#if HAVE_WCHAR_T
////

Delete or comment the line 128 and add 1 line as follows:

///// 삭제 / DELETE / УДАЛИТЬ ///
//#if @USE_MBSTATE_T@
///// 추가 / ADD / ДОВАВЛЯТЬ //
#if USE_MBSTATE_T
////

Delete or comment the lines 107-108 and add 2 lines as follows:

///// 삭제 / DELETE / УДАЛИТЬ ///
//#if @USE_MBSTATE_T@
//#if @BROKEN_WCHAR_H@
///// 추가 / ADD / ДОВАВЛЯТЬ //
#if USE_MBSTATE_T
#if BROKEN_WCHAR_H
////

Delete or comment the line 89 and add 2 lines as follows:

///// 삭제 / DELETE / УДАЛИТЬ ///
//extern LIBICONV_DLL_EXPORTED size_t iconv (iconv_t cd, @ICONV_CONST@ char* * inbuf, 
//size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);
///// 추가 / ADD / ДОВАВЛЯТЬ //
extern LIBICONV_DLL_EXPORTED size_t iconv (iconv_t cd, const char* * inbuf, 
	size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);
////

Delete or comment the lines 26 - 31 and add 8 lines as follows:

///// 삭제 / DELETE / УДАЛИТЬ ///
//#if @HAVE_VISIBILITY@ && BUILDING_LIBICONV
//#define LIBICONV_DLL_EXPORTED __attribute__((__visibility__("default")))
//#else
//#define LIBICONV_DLL_EXPORTED
//#endif
//extern LIBICONV_DLL_EXPORTED @DLL_VARIABLE@ int _libiconv_version; /* Likewise */
///// 추가 / ADD / ДОВАВЛЯТЬ //
#if BUILDING_LIBICONV
#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; /* Likewise */
////

How to Use

When you use newly builtlibiconv, the only header file that you need isiconv.h. You will need to link either the import librarylibiconv.libor thestaticlibrarylibiconvStatic.libin your project property or write the code in one of your source file as follows:

#pragma comment (lib, "libiconv.lib")
or
#pragma comment (lib, "libiconvStatic.lib")

In the source of the application that uses this library eitherlibiconv.dllorlibiconvStatic.lib, if you don't define anything but only includeiconv.h, your application will uselibiconv.dllwhile it will uselibiconvStatic.libif you defineUSING_STATIC_LIBICONVbefore you includeiconv.hin your application as follows:

//#define USING_STATIC_LIBICONV
#include <iconv.h>

Copyright Issues

The originallibiconvis under LGPL licence. So, the tweakedlibiconvhas also to be under LGPL. If you develop any application that useslibiconv, you have to be careful about copyright issues. If your application is linked withlibiconv.dlldynamically, you don't have to publicize your source code of your application. However, if your application is linked statically withlibiconvStatic.lib, you have to publicize either the source code of the application or the object files (*.obj) of the application so that others can build the application that is linked statically with the library under LGPL license.

License

This article, along with any associated source code and files, is licensed underThe GNU Lesser General Public License (LGPLv3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值