其實網絡上已經有很多關于這方面的知識了,這篇文章的目的也只在于加深印象,積累經驗,有人告訴我,寫文章對自己也是一種很好的幫助。希望這篇文章對其它人也有一點幫助,由于文筆水平不好,表述不清楚之與錯誤之處,還請見詳。 關于FreeType2L的介紹我不多
其實網絡上已經有很多關于這方面的知識了,這篇文章的目的也只在于加深印象,積累經驗,有人告訴我,寫文章對自己也是一種很好的幫助。希望這篇文章對其它人也有一點幫助,由于文筆水平不好,表述不清楚之與錯誤之處,還請見詳。
關于FreeType2L的介紹我不多說了,網上的文章還是比較多的。還有,本文只介紹我的安裝經歷,不對FreeType2庫的使用做介紹,如有需要,大家自己看參考手冊。
開篇:
從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動態鏈接到本庫中。因此,使用本庫的項目也要使用相應的線程庫。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com