跨平台的OpenGL程序如果要实现平滑字体显示,就必须利用FreeType2和FTGL库,这些库在Windows很容易配置,但是在mac下就有些麻烦,特别是在Xcode下开发Cocoa类程序时更是如此。这些库的源代码都有一些Makefile,在Mac下虽然能用但是它是针对Unix X11的,直接载入到Xcode会提示“is not required of architecture”。因此好的办法就是用Xcode进行编译成static library。我试了好长时间总算能用了。
我们一共要编译两个static library,一个是libFreetype.a,一个是libFTGL.a。
先下载FreeType库:http://www.freetype.org
FTGL库:http://sourceforge.net/projects/ftgl/
首先编译FreeType库
在源代码的docs中有一个INSTALL.ANY文件,用文本编辑器打开。我摘录了这几行:
* DO NOT COMPILE ALL C FILES! Rather, compile the following ones.
-- base components (required)
src/base/ftsystem.c
src/base/ftinit.c
src/base/ftdebug.c
src/base/ftbase.c
src/base/ftbbox.c -- recommended, see <freetype/ftbbox.h>
src/base/ftglyph.c -- recommended, see <freetype/ftglyph.h>
src/base/ftbdf.c -- optional, see <freetype/ftbdf.h>
src/base/ftbitmap.c -- optional, see <freetype/ftbitmap.h>
src/base/ftcid.c -- optional, see <freetype/ftcid.h>
src/base/ftfstype.c -- optional
src/base/ftgasp.c -- optional, see <freetype/ftgasp.h>
src/base/ftgxval.c -- optional, see <freetype/ftgxval.h>
src/base/ftlcdfil.c -- optional, see <freetype/ftlcdfil.h>
src/base/ftmm.c -- optional, see <freetype/ftmm.h>
src/base/ftotval.c -- optional, see <freetype/ftotval.h>
src/base/ftpatent.c -- optional
src/base/ftpfr.c -- optional, see <freetype/ftpfr.h>
src/base/ftstroke.c -- optional, see <freetype/ftstroke.h>
src/base/ftsynth.c -- optional, see <freetype/ftsynth.h>
src/base/fttype1.c -- optional, see <freetype/t1tables.h>
src/base/ftwinfnt.c -- optional, see <freetype/ftwinfnt.h>
src/base/ftxf86.c -- optional, see <freetype/ftxf86.h>
src/base/ftmac.c -- only on the Macintosh
-- font drivers (optional; at least one is needed)
src/bdf/bdf.c -- BDF font driver
src/cff/cff.c -- CFF/OpenType font driver
src/cid/type1cid.c -- Type 1 CID-keyed font driver
src/pcf/pcf.c -- PCF font driver
src/pfr/pfr.c -- PFR/TrueDoc font driver
src/sfnt/sfnt.c -- SFNT files support
(TrueType & OpenType)
src/truetype/truetype.c -- TrueType font driver
src/type1/type1.c -- Type 1 font driver
src/type42/type42.c -- Type 42 font driver
src/winfonts/winfnt.c -- Windows FONT / FNT font driver
-- rasterizers (optional; at least one is needed for vector
formats)
src/raster/raster.c -- monochrome rasterizer
src/smooth/smooth.c -- anti-aliasing rasterizer
-- auxiliary modules (optional)
src/autofit/autofit.c -- auto hinting module
src/cache/ftcache.c -- cache sub-system (in beta)
src/gzip/ftgzip.c -- support for compressed fonts (.gz)
src/lzw/ftlzw.c -- support for compressed fonts (.Z)
src/gxvalid/gxvalid.c -- TrueTypeGX/AAT table validation
src/otvalid/otvalid.c -- OpenType table validation
src/psaux/psaux.c -- PostScript Type 1 parsing
src/pshinter/pshinter.c -- PS hinting module
src/psnames/psnames.c -- PostScript glyph names support
Notes:
`ftcache.c' needs `ftglyph.c'
`ftfstype.c' needs `fttype1.c'
`ftglyph.c' needs `ftbitmap.c'
`ftstroke.c' needs `ftglyph.c'
`ftsynth.c' needs `ftbitmap.c'
`cff.c' needs `sfnt.c', `pshinter.c', and `psnames.c'
`truetype.c' needs `sfnt.c' and `psnames.c'
`type1.c' needs `psaux.c' `pshinter.c', and `psnames.c'
`type1cid.c' needs `psaux.c', `pshinter.c', and `psnames.c'
`type42.c' needs `truetype.c'
这里的意思是,有些c文件不须编译因为它们被包括到其他c文件中了。
新建一个xcode static library 工程, 如图:

把源代码中的include和src拷贝到xcode工程下,如图:

然后添加到管理器。
注意这里要删去部分源代码文件,就是INSTALL.ANY中没有提到的那些,但注意是delete references不是move to trash!那个ftmac.c最好也删去,我们不需要管它和mac的关系。
双击你的target在build中找到preprocessor macro,加入FT2_BUILD_LIBRARY

在build中找到header search path,加入“include/” (注意无引号,即我们复制进工程的头文件所在)

在源代码文件的ftobjs.c和ftbase.c中的
#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON )
#endif /* defined( FT_MACINTOSH ) && !defined( DARWIN_NO_CARBON ) */
两行注释掉。
这时点击build应该就能出来一个libFreeTypeStaticLib.a的文件了。
同理新建一个FTGLStaticLib工程,把FTGL的src文件夹和config.h文件复制进工程,把FreeType的include文件夹复制进工程,把前面得到的libFreeTypeStaticLib.a复制进工程。
在header search path中加入“src/”和“include/”
点击build就能出来另一个.a文件。
想测试一下的话新建一个command line tool c++工程,把得到的两个.a文件拖入,把FreeType的include文件夹和FTGL中的FTGL文件夹(里面都是头文件)拖入,把FTGL中demo文件夹的c-demo.c,trackball.c,trackball.h,tb.c,tb.h拖入,加入OpenGL 和 GLUT FrameWork。

(在c-demo.c,trackball.c和tb.c中把
#if defined HAVE_GL_GLUT_H
# include <GL/glut.h>
#elif defined HAVE_GLUT_GLUT_H
# include <GLUT/glut.h>
#else
# error GLUT headers not present
#endif
注释掉并加入#include <GLUT/GLUT.h>)
运行成功的画面:

http://hi.baidu.com/georgemonster/blog/item/8712853e785b2bf6838b1321.html