使用VS2005编译freetype的动态链接库--我加了一些错误修改的记录

 

转载的 使用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就可以了,重新定义如下所示:

 

 1
 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、我用的编译器是VS2008,大概也和这里说的过程差不多。
2、编译过程中有几个错误,我记录一下解决方法。
我的解决方法也许还有错误,暂时是先这样解决了。要是有错误希望大家指正。O(∩_∩)O谢谢
 
错误1: 
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
用定义跳转这个宏,在E:\freetype-2.4.4\include\freetype\internal\internal.h文件中
#define FT_INTERNAL_DEBUG_H               <freetype/internal/ftdebug.h>

查找ftdebug.h文件确实在该目录下,问题是winfnt.c文件中没有包含internal.h文件。
由于这样的错误有很多,而且internal.h文件名,反正最后把 \include\freetype\internal\internal.h 文件加到  \include\ft2build.h 文件中。
即:在\include\ft2build.h 文件中添加如下代码
#include <freetype/internal/internal.h>
后来又查找了一下,发现 \include\freetype\config\ftheader.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 

再次编译,剩下2个错误。 
 
错误2: 
错误提示如下:
1>e:\freetype-2.4.4\src\base\ftmac.c(100) : fatal error C1083: 无法打开包括文件:“CoreServices/CoreServices.h”: No such file or directory
查找后发现 确实没有 CoreServices.h 文件。
查看 INSTALL.ANY 文件  内容如下:
src/base/ftmac.c        -- only on the Macintosh
这用于苹果的机器。所以把该文件从项目中移除。
编译一下。该问题解决。
 
错误3:
错误代码如下: 
1>e:\freetype-2.4.4\src\cache\ftcmanag.c(708) : error C2491: “FTC_Manager_Lookup_Size”: 不允许 dllimport 函数 的定义
 
查找,发现 \src\cache\ftcache.c 文件包含上面的错误文件 ftcmanag.c 。
查看 INSTALL.ANY 文件  内容如下:
src/cache/ftcache.c     -- cache sub-system (in beta)
没用。所以,从项目中移除。
编译后,通过。
这个错误我还是不太明白,谁有建议给我讲讲。
 
错误4:
 以上错误都解决后,我的debug和release版本都编译通过了。
然后,使用DLL看看是否可用。这时,发现没用LIB文件。
最后,发现原因,没有任何导出,所以没用LIB。
查找 include\freetype\config\ftoption.h 文件中,设置的导出定义。
发现没有
#define FT2_DLL
语句,所以,根本就没有导出。
所以,在 include\freetype\config\ftoption.h 文件中,定义该语句如下:
#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版本都编译通过了。
在项目中,调用相关DLL和LIB文件可用。
 
freetype的DLL版本编译完成。可喜可贺,(*^__^*) 嘻嘻……
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值