|
|
发表于 2006-10-18 15:14:04
|
显示全部楼层
BLFS编译Xorg-6.9.0问题
各种依存关系包都已装上,编译Xorg时出现错误:
ftfuncs.c:54:10: #include expects "FILENAME" or <FILENAME>
ftfuncs.c:56:10: #include expects "FILENAME" or <FILENAME>
ftfuncs.c:57:10: #include expects "FILENAME" or <FILENAME>
ftfuncs.c: In function `FreeTypeOpenInstance':
ftfuncs.c:464: error: `TT_Face' undeclared (first use in this function)
ftfuncs.c:464: error: (Each undeclared identifier is reported only once
ftfuncs.c:464: error: for each function it appears in.)
ftfuncs.c:464: error: parse error before "tt_face"
ftfuncs.c:468: error: `SFNT_Service' undeclared (first use in this function)
ftfuncs.c:468: error: parse error before "sfnt"
ftfuncs.c:469: error: `tt_face' undeclared (first use in this function)
ftfuncs.c:469: error: parse error before "face"
ftfuncs.c:483: error: `sfnt' undeclared (first use in this function)
ftfuncs.c:483: error: parse error before "tt_face"
ftfuncs.c: In function `tt_get_metrics':
ftfuncs.c:812: error: `TT_LongMetrics' undeclared (first use in this function)
ftfuncs.c:812: error: parse error before "longs_m"
ftfuncs.c:821: error: `longs_m' undeclared (first use in this function)
ftfuncs.c:821: error: parse error before "header"
ftfuncs.c:826: error: `TT_ShortMetrics' undeclared (first use in this function)
ftfuncs.c:826: error: parse error before ')' token
ftfuncs.c:827: error: parse error before "header"
ftfuncs.c: In function `ft_get_very_lazy_bbox':
ftfuncs.c:842: error: `TT_Face' undeclared (first use in this function)
ftfuncs.c:842: error: parse error before "ttface"
ftfuncs.c:849: error: `ttface' undeclared (first use in this function)
ftfuncs.c: In function `FT_Do_SBit_Metrics':
ftfuncs.c:911: error: `SFNT_Service' undeclared (first use in this function)
ftfuncs.c:911: error: parse error before "sfnt"
ftfuncs.c:912: error: `TT_Face' undeclared (first use in this function)
ftfuncs.c:915: error: `TT_SBit_Strike' undeclared (first use in this function)
ftfuncs.c:915: error: parse error before "strike"
ftfuncs.c:916: error: `TT_SBit_Range' undeclared (first use in this function)
ftfuncs.c:917: error: `TT_SBit_MetricsRec' undeclared (first use in this function)
ftfuncs.c:928: error: `face' undeclared (first use in this function)
ftfuncs.c:928: error: parse error before "ft_face"
ftfuncs.c:929: error: `sfnt' undeclared (first use in this function)
ftfuncs.c:929: error: parse error before "face"
ftfuncs.c:934: error: `range' undeclared (first use in this function)
ftfuncs.c:934: error: `strike' undeclared (first use in this function)
ftfuncs.c:951: warning: implicit declaration of function `FT_STREAM_POS'
ftfuncs.c:954: warning: implicit declaration of function `FT_STREAM_SEEK'
ftfuncs.c:957: error: `elem_metrics' undeclared (first use in this function)
make[5]: *** [ftfuncs.o] Error 1
make[5]: Leaving directory `/sources/xcbuild/lib/font/FreeType'
make[4]: *** [FreeType] Error 2
make[4]: Leaving directory `/sources/xcbuild/lib/font'
make[3]: *** [all] Error 2
make[3]: Leaving directory `/sources/xcbuild/lib'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/sources/xcbuild'
make[1]: *** [World] Error 2
make[1]: Leaving directory `/sources/xcbuild'
make: *** [World] Error 2
提示错误的是ftfuncs.c有多个未定义的数据类型,另外还指示了54、56、57三行包含的头文件有问题,应该就是没有include这三个头文件,以致后面的错误
下面一步步跟踪,首先看看ftfuncs.c在哪里:
# find . -name "ftfuncs.c"
./lib/font/FreeType/ftfuncs.c
看看它54、56、57行到底写了什么:
# vi ./lib/font/FreeType/ftfuncs.c
定位到54行,原来这几行是:
54: #include FT_INTERNAL_TRUETYPE_TYPES_H
56: #include FT_INTERNAL_SFNT_H
57: #include FT_INTERNAL_STREAM_H
原来在ftfuncs.c里,这三个头文件是用宏定义表示的,究竟是什么呢?使用下面命令查找来源:
# find . -name "*" | xargs grep FT_INTERNAL_TRUETYPE_TYPES_H
# find . -name "*" | xargs grep FT_INTERNAL_SFNT_H
# find . -name "*" | xargs grep FT_INTERNAL_STREAM_H
结果中会有这么几行:
./extras/freetype2/include/freetype/internal/internal.h:#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h>
./extras/freetype2/include/freetype/internal/internal.h:#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h>
./extras/freetype2/include/freetype/internal/internal.h:#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h>
显示这几个头文件都是在internal.h中声明的,查看该文件,它说自己是被ft2build.h包含的
另外查看ftfuncs.c,的确是include了ft2build.h
查找ft2build.h:
# find . -name "ft2build.h"
./lib/font/FreeType/module/ft2build.h
./extras/freetype2/devel/ft2build.h
./extras/freetype2/include/ft2build.h
分别查看内容,无论哪一个ft2build.h,都include了ftheader.h
查找ftheader.h:
# find . -name "ftheader.h"
./lib/font/FreeType/module/ftheader.h
./extras/freetype2/include/freetype/config/ftheader.h
分别查看内容,无论哪一个ftheader.h,都include了internal.h
这下大概搞清楚几个文件之间的包含关系了:
ftfuncs.c-->ft2build.h-->ftheader.h-->internal.h-->tttypes.h,sfnt.h,ftstream.h
够复杂的了。可是,为什么到最后不能找到头文件呢?难道是路径有问题?
ftfuncs.c里包含ft2build.h用的是include <>,也就是说,使用标准方式,到存放C库函数头文件所在的目录中寻找要包含的文件。于是找到编译ftfuncs.o是的语句:
gcc -m32 -c -ansi -Wall -Wpointer-arith -Wundef -I/usr/include/freetype2 -I/usr/include/freetype2/config -I. -I../../../include/fonts -I../include -I../../../exports/include/X11 -I../../../programs/Xserver/include -I../../../exports/include -I../../.. -I../../../exports/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -DGCCUSESGAS -DAVOID_GLYPHBLT -DPIXPRIV -DSINGLEDEPTH -DXFreeXDGA -DXvExtension -DXFree86LOADER -DDLOPEN_HACK -DXFree86Server -DXF86VIDMODE -DXvMCExtension -DSMART_SCHEDULE -DBUILDDEBUG -DXResExtension -DX_BYTE_ORDER=X_LITTLE_ENDIAN -DXORG_VERSION_CURRENT="(((6) * 10000000) + ((9) * 100000) + ((0) * 1000) + 0)" -DXFREE86_FT2 -O2 -fno-strength-reduce -fno-strict-aliasing ftfuncs.c -o unshared/ftfuncs.o
注意包含头文件那一段,好像没有包括上述几个ft2build.h所在的路径(都在xorg安装路径下),把上述几个ft2build.h改名为ft2build.h.bak再执行上面那句编译,也没说找不到ft2build.h,说明确实是存在另一个ft2build.h,而这个ft2build.h又没有正确include所需要的头文件
注意到上面的编译语句设定的路径还有/usr/include/freetype2和/usr/include/freetype2/config,于是在/usr目录下找:
# find /usr -name "ft2build.h"
/usr/include/ft2build.h
把它改名为ft2build.h.bak,再用上面的语句编译ftfuncs.c,果然说找不到ft2build.h了
继续查找其它需要的头文件:
# find /usr -name "ftheader.h"
/usr/include/freetype2/freetype/config/ftheader.h
# find /usr -name "internal.h"
/usr/include/pci/internal.h
/usr/include/php/ext/pcre/pcrelib/internal.h
(看路径和文件内容,这两个与xorg风马牛不相及)
另外三个:tttypes.h、sfnt.h、ftstream.h,更是不存在于/usr目录
现在知道问题在哪里了:编译程序找不到internal.h及其包含的头文件,经研究后执行:
# cp -rv ./extras/freetypes/include/freetype/* /usr/include/freetype2/freetype
也就是把头文件拷贝过去,执行上面的编译语句,没有问题,重新编译xorg,也OK了
其实我在安装xorg前是装好了freetype的,但就是不明白为什么缺了那几个头文件,看看网上,同样的问题也不少,现在也不清楚这样处理是否有什么后遗症,反正过了再说吧 |
|