從http://www.freetype.org下載源代碼。
FreeType2庫源碼包中包含多種環境與編譯器下的make文件,其中還包含vc的項目文件。
我用的是VC,所以首先找到VC環境的項目文件。該文件在 /builder/win32/visualc目錄下面,該目錄包含vc6與vs2005的項目文件。不過好像它的vc6版本的項目文件有點問題,我用vc6是不能正確打開的,不過vs2005可以很好的工作。打開vs2005的項目進行編譯就可以了,沒有錯誤的放就會在/objs目錄下產生相應的lib靜態庫文件。以上過程是通常的方法。
但是現在遇到一個問題是,因爲官方所給的項目文件只能產生靜態鏈接庫文件(LIB),如果你想產生動態鏈接庫(DLL)文件的話,那你就得自己想辦法了。我的的重點也在於講如何編譯成DLL文件。
我的工作環境是VC6,但由於官方給出的vc6文件是有問題,我也懶得去看到底是什麼問題了,所以我傾向於重建自己的項目文件。
解決:
Freetype2是一個高度可定製化的庫,而FreeType2包內的文檔也足夠讓我做到我想做的事情。
第一步:
我參考的第一個文檔是/doc目錄下的INSTALL.ANY。該文檔其實已經把標準編譯所要包含的文件及它們的作用說得很清楚了,那我現在要做的就是新建一個vc6 win32DLL工程,選擇empty工程選項,產生一個空dll工程了,然後按照INSTALL.ANY的說明把需要加入的文件加入工程內,INSTALL.ANY文件內有一很明顯的提醒:“DO NOT COMPILE ALL C FILES!”,就是不要編譯所有的C文件,這點應該注意。
第二步:
第二個參照和修改的文件是ftoption.h,該文件在/include/freetype/config目錄下,該目錄主要存放一些配置頭文件。ftoption.h文件裏對每一可定製項目都有很詳細的解釋,而且還給出了使用ftoption.h配置FreeType2庫的三種手段。那我用的方法不知道是不是其中之一:
一、首先備份一下ftoption.h,如,另存爲ftoption_bak.h文件。
二、根據ftoption.h在"DLL export compilation"項裏的描述,FreeType2庫在需要導出的函數前都使用了FT_EXPORT(用在函數定義處),FT_EXPORT_DEF(用在函數聲明處)兩個宏,因此我只需要重新定義這兩個宏就OK了。FreeType2庫對於FT_EXPORT和FT_EXPORT_DEF宏的缺省定義在ftconfig.h文件中。
我的做法是,在ftopion.h的該處重新定義自己的FT_EXPORT和FT_EXPORT_DEF,如下所示:
#ifdef FT2_DLL //因爲在靜態庫與動態中都使用該文件,所以區別使用該指示字,使用FT2_DLL表示要編譯爲DLL動態庫。
#ifdef FT2_EXPORTS //按照微軟的標準做法,定義__declspec(dllexport)與__declspec(dllimport)
#define FT_EXPORT( x ) __declspec(dllexport) x
#define FT_EXPORT_DEF( x ) x
#else //按照微軟的說法,其它__declspec(dllimport)也可以不要的,但這樣做更有效率並且如果不這麼做時,在導出變量時有時會出現問題,so!照他說的做吧。
#define FT_EXPORT( x ) __declspec(dllimport) x
#define FT_EXPORT_DEF( x ) x
#endif
#endif
編譯DLL需要做的就已經完成了,另還要需要注意的是:因爲是重建的項目文件,所以參照官方項目文件,在ftoption.h中的"Debug level "項修改如下:
#ifdef _DEBUG
#define FT_DEBUG_LEVEL_ERROR
#define FT_DEBUG_LEVEL_TRACE
#endif
三、在vc6項目文件中需要定義FT_DLL(我們在前面定義的),FT_EXPORT(我們在前面定義的),FT2_BUILD_LIBRARY(編譯成庫文件所需要的)預定義標誌。然後再按常規DLL的方法定義輸出目錄,其它預編譯指令之類,就可以生成DLL文件了,注:同時還會生成.LIB和.EXP文件。
四、我們也可以按照同樣的方法新建一個空win32靜態鏈接庫項目,但預定義標誌與Freetype2爲相關只需要FT2_BUILD_LIBRARY(編譯成庫文件所需要)預定義標誌。
五、建一個空工程文件包含這兩個項目文件,最後一步就OK了。
FreeType2是一個靈活,可定製性高及性能很不錯的庫,關於更多的定製,比如模塊的選擇,系統接口的定製,可以參照它的安裝文檔,文檔裏都有說明。
另1:可以順便提一下FTGL庫,這個一個基於利用FreeType實現在OpenGL下字體繪製的庫,因爲作者沒有考慮(或解決)FreeType動態庫的問題,所以只包含使用FreeType2靜態庫的的項目文件,用FTGL庫的朋友也可以根據以下思路進行更改,重建自己的項目文件。
另2:關於vc DLL使用的三種線程庫:原官方FreeType2的vc項目文件的六個配置分別對應於發佈和調試版本的三種線程庫。單線程:指的將LIBC.lib靜態鏈接到本庫中,多線程:指的將LIBCMT.lib靜態鏈接到本庫中,多線程DLL:指的是將MSVCRT.dll動態鏈接到本庫中。因此,使用本庫的項目也要使用相應的線程庫。
轉載自:http://blog.csdn.net/alexander0514/article/details/1804007