freetype 依赖libpng, 我采用的freetype 版本是2.9 libpng版本是1.2.8
编译freetype2.9 时,遇到如下错误字段: 这段话来自 libpng的头文件, pngconf.h
__pngconf.h__ already includes setjmp.h; __dont__ include it again.;意思是freetype 里也include 了setjmp.h?
查看 freetype 代码。果然
freetype-2.9/src/sfnt/pngshim.c:30: /* We always include <setjmp.h>, so make libpng shut up! */
似乎freetype 与 libpng 有着不可描述的故事,很有意思。
诚然这个问题,可通过升级libpng的版本解决。(实测用1.6.x的 libpng不会出现该问题)
但项目中,SDK中是基于libpng1.2.8 , 为了兼容SDK, 还是硬着头皮编译吧。 把freetype中include “setjmp.h” 的地方挪到一个新的头文件中, 在没有include libpng头文件, 而又需要setjmp的地方,再include 这个新的头文件。 在freetype里几处调整之后,最终可以编译通过, 整理补丁如下,
diff -Naurp freetype-2.9_org/include/for_png_1_2_X.h freetype-2.9/include/for_png_1_2_X.h --- freetype-2.9_org/include/for_png_1_2_X.h 1970-01-01 08:00:00.000000000 +0800 +++ freetype-2.9/include/for_png_1_2_X.h 2020-09-04 15:29:42.428884604 +0800 @@ -0,0 +1,17 @@ +/* +Fix setjmp.h conflict when using png 1.2.X +*/ +#ifndef FOR_PNG_1_2_X_H +#define FOR_PNG_1_2_X_H + +#include <setjmp.h> + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* jmp_buf is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */ + +#endif + diff -Naurp freetype-2.9_org/include/freetype/config/ftstdlib.h freetype-2.9/include/freetype/config/ftstdlib.h --- freetype-2.9_org/include/freetype/config/ftstdlib.h 2020-09-04 15:33:27.253502905 +0800 +++ freetype-2.9/include/freetype/config/ftstdlib.h 2020-09-04 15:31:56.921021663 +0800 @@ -152,7 +152,7 @@ /* */ /**********************************************************************/ - +#if 0 /*move it to "for_png_1_2_X.h" when using png1.2.X. fix setjmp.h conflict issue*/ #include <setjmp.h> #define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ @@ -161,7 +161,7 @@ #define ft_longjmp longjmp #define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */ - +#endif /* the following is only used for debugging purposes, i.e., if */ /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ diff -Naurp freetype-2.9_org/include/freetype/internal/ftvalid.h freetype-2.9/include/freetype/internal/ftvalid.h --- freetype-2.9_org/include/freetype/internal/ftvalid.h 2020-09-04 15:33:27.253502905 +0800 +++ freetype-2.9/include/freetype/internal/ftvalid.h 2020-09-04 15:32:23.158323991 +0800 @@ -22,6 +22,7 @@ #include <ft2build.h> #include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ +#include "for_png_1_2_X.h" FT_BEGIN_HEADER diff -Naurp freetype-2.9_org/src/sfnt/pngshim.c freetype-2.9/src/sfnt/pngshim.c --- freetype-2.9_org/src/sfnt/pngshim.c 2020-09-04 15:33:27.217502806 +0800 +++ freetype-2.9/src/sfnt/pngshim.c 2020-09-04 15:32:10.170055530 +0800 @@ -34,6 +34,7 @@ #include "sferrors.h" +#include "for_png_1_2_X.h" /* This code is freely based on cairo-png.c. There's so many ways */ /* to call libpng, and the way cairo does it is defacto standard. */ diff -Naurp freetype-2.9_org/src/smooth/ftgrays.c freetype-2.9/src/smooth/ftgrays.c --- freetype-2.9_org/src/smooth/ftgrays.c 2020-09-04 15:33:27.221502818 +0800 +++ freetype-2.9/src/smooth/ftgrays.c 2020-09-04 15:32:00.928953980 +0800 @@ -285,6 +285,7 @@ typedef ptrdiff_t FT_PtrDist; #define Smooth_Err_Memory_Overflow Smooth_Err_Out_Of_Memory #define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory +#include "for_png_1_2_X.h" #endif /* !STANDALONE_ */