转载的 使用VS2005编译freetype的动态链接库 我加了一些错误修改的记录。所以,算是原创吧。(*^__^*) 嘻嘻……
使用freetype是2.3.8版本,freetype2.3.8包解压缩后,在.\builds\win32\visualc目录下有基于vs2005的sln文件,不过这个解决方案文件,只是包含有生成静态链接的工程设置,要编译动态链接库,还需要手动去处理一下。步骤如下:
1:
参考./doc目录下的INSTALL.ANY文档。该文档其实已经把标准编译所要包含的文件及它们的作用说得很清楚了,现在使用VC2005建立一个空的win32DLL工程,然后按照INSTALL.ANY的说明把需要加入的文件加入工程内,INSTALL.ANY文件内有一很明显的提醒:“DO NOT COMPILE ALL C FILES!”,就是不要编译所有的C文件,这点应该注意。
2:
要进行修改的文件是ftoption.h,该文件在/include/freetype/config目录下,该目录主要存放一些配置头文件。ftoption.h文件里对每一可定制项目都有很详细的解释,为了可以编译成DLL,要进行的修改是:
一、首先备份一下ftoption.h,如,另存为ftoption_bak.h文件。
二、根据ftoption.h在"DLL export compilation"项里的描述,FreeType2库在需要导出的函数前都使用了FT_EXPORT(用在函数定义处),FT_EXPORT_DEF(用在函数声明处)两个宏,需要重新定义这两个宏。FreeType2库对于FT_EXPORT和FT_EXPORT_DEF宏的缺省定义在ftconfig.h文件中。所以在ftopion.h的该处重新定义自己的FT_EXPORT和FT_EXPORT_DEF就可以了,重新定义如下所示:
2 #ifdef FT2_DLL // 因为在静态库与动态中都使用该文件,所以区别使用该指示字,使用FT2_DLL表示要编译为DLL动态库。
3 #ifdef FT2_EXPORTS // 按照微软的标准做法,定义__declspec(dllexport)与__declspec(dllimport)
4 #define FT_EXPORT( x ) __declspec(dllexport) x
5 #define FT_EXPORT_DEF( x ) x
6 #else // 按照微软的说法,其它__declspec(dllimport)也可以不要的,但这样做更有效率并且如果不这么做时,在导出变量时有时会出现问题
7 #define FT_EXPORT( x ) __declspec(dllimport) x
8 #define FT_EXPORT_DEF( x ) x
9 #endif
10 #endif
11
12
3:编译,便能编译出一个基于多线程C运行库的freetype DLL
转载链接:
http://www.cppblog.com/GameAcademe/articles/89389.html
平平注释:
1>E:\freetype-2.4.4\src\winfonts\winfnt.c(23) : error C2006: “#include”: 应输入文件名,却找到“标识符”
1>E:\freetype-2.4.4\src\winfonts\winfnt.c(23) : fatal error C1083: 无法打开包括文件:“”: No such file or directory
#include FT_INTERNAL_DEBUG_H
#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h>
查找ftdebug.h文件确实在该目录下,问题是winfnt.c文件中没有包含internal.h文件。
#include <freetype/internal/internal.h>
/*
* Include internal headers definitions from <freetype/internal/...>
* only when building the library.
*/
#ifdef FT2_BUILD_LIBRARY
#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h>
#include FT_INTERNAL_INTERNAL_H
#endif /* FT2_BUILD_LIBRARY */
所以,我把 ft2build.h文件中的包含代码改了。(但是这里我不知道为什么要这样改,就是感觉这样好看?谁知道为什么告诉我)
//#include <freetype/internal/internal.h>
#define FT2_BUILD_LIBRARY
1>e:\freetype-2.4.4\src\base\ftmac.c(100) : fatal error C1083: 无法打开包括文件:“CoreServices/CoreServices.h”: No such file or directory
src/base/ftmac.c -- only on the Macintosh
1>e:\freetype-2.4.4\src\cache\ftcmanag.c(708) : error C2491: “FTC_Manager_Lookup_Size”: 不允许 dllimport 函数 的定义
src/cache/ftcache.c -- cache sub-system (in beta)
这个错误我还是不太明白,谁有建议给我讲讲。
#define FT2_DLL
#define FT2_DLL //这行为我添加的
#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)也可以不要的,但这样做更有效率并且如果不这么做时,在导出变量时有时会出现问题
#define FT_EXPORT( x ) __declspec(dllimport) x
#define FT_EXPORT_DEF( x ) x
#endif
#endif
再次编译,debug和release版本都编译通过了。