1. 程式人生 > >VS2008編譯iconv靜態連結庫

VS2008編譯iconv靜態連結庫

iconv是將一種編碼格式轉換為另一種編碼格式的開源庫,例如可以把Windows環境下通用的ASCii(中文是GB2312)編碼轉換為國際通用的Unicode編碼

iconv最新版本只支援MingW和Cygwin編譯

2、新建一個VC空工程(libIconv)

(1)libIconv工程下新建一個資料夾Iconv

(2)將下載的庫中lib資料夾下的所有檔案拷貝到這個資料夾下

(3)將烤入到Iconv資料夾下的config.h.in重新命名為config.h

(3)將庫中libcharset/lib/localcharset.c檔案拷貝到這個資料夾下

(4)將庫中include資料夾下iconv.h.in檔案重新命名為iconv.h放在Iconv資料夾下

(5)將庫中scrLib/localcharset.h檔案拷到Iconv資料夾下

3、工程中新增現有項,將 iconv.c ,localcharset.c 新增到工程中.

4、工程屬性->C/C++ –>附加包含目錄:../Iconv;

5、工程屬性:常規->配置型別->靜態庫(.lib)

6、修改檔案中的BUG:

(1) iconv.h :

1).刪除掉所有的 @ 符號 (14處) 
2).修改25行: extern DLL_VARIABLE int _libiconv_version;

      為  extern /*DLL_VARIABLE*/ int _libiconv_version;  
3).修改83行:extern size_t iconv (iconv_t cd, ICONV_CONST char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); 

      為 extern size_t iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);

(2)localcharset.c:

      註釋掉76行:  # include "configmake.h"  

7、右擊解決方案,選擇生成解決方案。

得libIconv.lib靜態連結庫。標頭檔案是iconv.h(Iconv資料夾下)

使用:

#include <iostream>
#include <string>
using namespace std;
#include "iconv.h"
#pragma comment(lib,"iconv.lib")


int code_convert(char *from_charset,char *to_charset,const char *inbuf, size_t inlen,char *outbuf, size_t outlen)
{
iconv_t cd;
const char **pin = &inbuf;
char **pout = &outbuf;


cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd, pin, &inlen,pout, &outlen)==-1) return -1;
iconv_close(cd);
return 0;
}


* UTF-8 to GBK  */
int u2g(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert("UTF-8","GBK",inbuf,inlen,outbuf,outlen);
}


* GBK to UTF-8 */
int g2u(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert("GBK", "UTF-8", inbuf, inlen, outbuf, outlen);
}


void readFile(const char* pchFileName,string &strFileContent)
{
char* buffer = NULL;
int nLen = 0;
FILE *fp = fopen(pchFileName,"rb");
if (fp == NULL)
{
cout << pchFileName << " open failed!" << endl;
exit(1);
}


fseek(fp,0L,SEEK_END);      //檔案指標移到檔案尾  
long fsize = ftell(fp);     //得到當前指標位置,既檔案的長度
rewind(fp);                 //檔案指標恢復到檔案頭位置
//動態申請空間,為儲存字串結尾標誌'\0',多申請一個字元的空間。
buffer = (char*)malloc(sizeof(char)*fsize+1);
if (buffer == NULL)
{
cout << "memory error!" << endl;
fclose(fp); //不再使用檔案,關閉
exit(1);
}


nLen=fread(buffer,sizeof(char),fsize,fp);
buffer[nLen] = '\0';//新增字串結尾標誌
string strBuffer(buffer);
strFileContent = strBuffer;
free(buffer);
buffer = NULL;//釋放後也要把指標設成NULL,避免野指標。
fclose(fp);
}


int main()
{


string strFileContent;
readFile("3.txt",strFileContent);
cout << strFileContent << endl;


size_t iInBytes,oOutBytes;
iInBytes = strFileContent.length();
oOutBytes = 3*iInBytes+1;
char *pchDestStr = new char[oOutBytes];
memset(pchDestStr,0,oOutBytes);
g2u(strFileContent.c_str(),iInBytes,pchDestStr,oOutBytes);
cout << pchDestStr << endl;






system("pause");
return 0;
}

相關推薦

VS2008編譯iconv靜態連結

iconv是將一種編碼格式轉換為另一種編碼格式的開源庫,例如可以把Windows環境下通用的ASCii(中文是GB2312)編碼轉換為國際通用的Unicode編碼 iconv最新版本只支援MingW和Cygwin編譯 2、新建一個VC空工程(libIconv) (

(轉)靜態編譯,動態編譯靜態連結,動態連結

1.定義 LIB檔案中包含函式程式碼本身,在編譯時直接將程式碼加入程式當中。稱為靜態連結庫static link library。 LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic link libr

靜態編譯,動態編譯靜態連結,動態連結

1.定義 LIB檔案中包含函式程式碼本身,在編譯時直接將程式碼加入程式當中。稱為靜態連結庫static link library。 LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic li

ffmpeg編譯靜態連結問題

安裝了ffmpeg在wince編譯生成dll和.a檔案,但是發現這個.a檔案並不是像win32下面的lib檔案,不能夠直接呼叫,如果直接呼叫會產生error LNK2001: unresolved external sy

靜態連結編譯與使用 linux下的動態連結靜態連結到底是個什麼鬼?(一)靜態連結編譯與使用

linux下的動態連結庫和靜態連結庫到底是個什麼鬼?(一)靜態連結庫的編譯與使用       知識不等於技術,這句話真的是越工作的時間長越深有體會,學習到的知識只有不斷的實踐,才成真正在自已的心裡紮下根,成為自身的一部分,所以無論如何,我希望我的部落格可以

GCC編譯過程與動態連結靜態連結(未整理)

來源:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6410588.html 根據連結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在連結階段被連結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時

GCC 編譯使用動態連結靜態連結--及先後順序----及環境變數設定總結

1 庫的分類 根據連結時期的不同,庫又有靜態庫和動態庫之分。 靜態庫是在連結階段被連結的(好像是廢話,但事實就是這樣),所以生成的可執行檔案就不受庫的影響了,即使庫被刪除了,程式依然可以成功執行。 有別於靜態庫,動態庫的連結是在程式執行的時候被連結的。所以,即使

GCC 編譯使用動態連結靜態連結

1 庫的分類 根據連結時期的不同,庫又有靜態庫和動態庫之分。 靜態庫是在連結階段被連結的(好像是廢話,但事實就是這樣),所以生成的可執行檔案就不受庫的影響了,即使庫被刪除了,程式依然可以成功執行。 有別於靜態庫,動態庫的連結是在程式執行的時候被連結的。所以,即使程式編譯完,

g++ 編譯動態連結靜態連結

現在我有hello1.cpp和hello2.cpp兩個檔案,現在我要生成動態連結庫libhello.so和靜態連結庫libhello.a。以下為步驟: 1.生成動態連結庫: g++ -m32 hello1.cpp hello2.cpp -fPIC -shared -o ..

GCC 編譯使用動態連結靜態連結的方法

1 庫的分類 根據連結時期的不同,庫又有靜態庫和動態庫之分。 靜態庫是在連結階段被連結的(好像是廢話,但事實就是這樣),所以生成的可執行檔案就不受庫的影響了,即使庫被刪除了,程式依然可以成功執行。 有別於靜態庫,動態庫的連結是在程式執行的時候被連結的。所以,即使程式

C語言函式:動態連結靜態連結

首先,函式庫就是一些事先寫好的函式的集合,是別人分享的,我們可以拿來使用的。經過一些校準和整理,就形成一份標準化的函式庫。例如glibc 函式庫有兩種提供形式:動態連結庫與靜態連結庫 早起函式庫裡的函式都是直接共享的,就是所謂的開源社群。後來函式庫商業化,就出現了靜態連結庫與動態連結庫。

關於原始檔,標頭檔案,靜態連結檔案,動態連結檔案的的理解

先從原始檔和標頭檔案的關係說起,由於是還是初學階段,只接觸了C++語言和windows平臺下的程式設計,所以只講這兩方面的東東, 標頭檔案的作用:對函式,變數,和類的宣告,其實在標頭檔案也可對一些特殊函式和變數定義,比如可以在標頭檔案中對行內函數和const型別變數定義,由於對類的宣告

靜態連結(LIB)和動態連結(DLL),DLL的靜態載入和動態載入,兩種LIB檔案。

靜態連結庫(LIB)和動態連結庫(DLL),DLL的靜態載入和動態載入,兩種LIB檔案。 一、 靜態連結庫(LIB,也簡稱“靜態庫”)與動態連結庫(DLL,也簡稱“動態庫”)的區別 靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最

動態連結靜態連結的優缺點

轉載參考博文 1、靜態連結庫的優點: (1) 程式碼裝載速度快,執行速度略比動態連結庫快; (2) 只需保證在開發者的計算機中有正確的.LIB檔案,在以二進位制形式釋出程式時不需考慮在使用者的計算機上.LIB檔案是否存在及版本問題,可避免dll地獄等問題。 2 、動態連結庫的優點 (

C實現JAVA類似ArrayList的靜態連結

檔案結構: ArrayList.h:標頭檔案 ArrayList.c:實現標頭檔案中的功能 ArrayListTest.c:測試 ArrayList.h 標頭檔案的基本框架: #ifndef _ARRAYLIST_H #define _ARRAYLIST_H /

Linux中,.a和.so,其實就是靜態連結與動態連結

詳細查了一下,.a與.so的區別,其實就是靜態連結庫與動態連結庫。有一篇博文,很詳細,附上鍊接:http://blog.csdn.net/nieyinyin/article/details/6890557   Linux下的.so是基於Linux下的動態連結,其功能和作用類

linux 把靜態連結.a連結到動態連結.so裡

個人分類: linux編譯連結         最近公司的專案中突然出現了這樣一個需求,我簡化再概括後如下:有兩大模組,其中一個模組a最終編譯出一個可執行檔案exec_a,另一個模組b編譯出一個動態連結庫lib_b.so被模組a的程式exec_a所連結。現在模組b中分出

如何製作vc6靜態連結的IDA SIG檔案

網上有製作vc靜態連結庫的IDA SIG檔案的文章,但是他針對的是VC7, 並且給出的指令碼有一點小問題,我基於他的基礎做了部分修改: 1. 把vc6下的libc.lib 拷貝到flair61\bin路徑下,這樣執行prf,sigmake就不用再指定長長的路徑 2.嘗試用

動態連結靜態連結的相互包含問題及實現

動態連結庫和靜態連結庫的基本概念請參考 1.《深入理解計算機系統》第七章連結 2.《程式設計師的自我修養》第4章 靜態連結和第7章 動態連結 3. http://blog.jobbole.com/86852/ 目的 為了封裝程式碼,簡化介面,我們要把已有應用程式碼封裝為

原始檔,標頭檔案,靜態連結檔案,動態連結檔案的的理解

如果你把一個.exe檔案只接放到沒有操作系充的“裸機”上去執行,顯然是執行不了的,可是你把這個程式放在一個裝有windows系統的電腦上就能運行了,顯然,程式的執行還是得依靠windows作業系統,這裡就要說到.dll檔案,上面說到的連結這一步時的程式碼複製只講到對程式作者自已寫的檔案和.lib檔案中用到的程