这几日想研究下doxygen,发现其include了xapian.h,一败毒发现是个字符串查找库,正好字符串查找也是研究重点之一,下了份xapian 1.2.8准备编译。结果出现
NMAKE : fatal error U1073: 不知道如何生成“"pian\xapian-core-1.2.8\config.h"”
Stop.
NMAKE : fatal error U1077: “"C:\Program Files\Microsoft Visual Studio 9.0\VC\BI
N\nmake.EXE"”: 返回代码“0x2”
Stop.
这个错误。
本人很奇怪,不知为何会有pian\这个路径,用工具搜索,发现common\Makefile中有如下内容:
#Automatically generated dependencies from XAPDEP follow:
bitstream.obj : "pian\xapian-core-1.2.8\config.h"
bitstream.obj : "pian\xapian-core-1.2.8\common\bitstream.h"
bitstream.obj : "apian\xapian-core-1.2.8\include\xapian/types.h"
bitstream.obj : "apian\xapian-core-1.2.8\include\xapian/visibility.h"
bitstream.obj : "xapian\xapian-core-1.2.8\include\xapian/version.h"
bitstream.obj : "rogram Files\Microsoft Visual Studio 9.0\VC\INCLUDE\string"
bitstream.obj : "Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\istream"
bitstream.obj : "\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\ostream"
bitstream.obj : ":\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\ios"
bitstream.obj : "C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocnum"
bitstream.obj : "C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\climits"
bitstream.obj : "C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\yvals.h"
bitstream.obj : "C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\crtdefs.h"
bitstream.obj : "C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\sal.h"
很明显路径有问题,cl找不到对应文件自然编译不过。
造成自个问题的原因很可能就是那个XAPDEP 。
win32目录下有个XAPDEP 目录,里面有XAPDEP 的源代码。
看题头是2010年写的,但是写的非常简单草率,我只能这么认为。
它的主要功能是从deps.d文件中提取需要的文件路径再添加到MAKEFILE文件中去。
但是deps.d文件中是什么样呢?
注意: 包含文件: C:\xapian\xapian-core-1.2.8\config.h
注意: 包含文件: c:\xapian\xapian-core-1.2.8\common\bitstream.h
注意: 包含文件: C:\xapian\xapian-core-1.2.8\include\xapian/types.h
注意: 包含文件: C:\xapian\xapian-core-1.2.8\include\xapian/visibility.h
注意: 包含文件: C:\xapian\xapian-core-1.2.8\include\xapian/version.h
注意: 包含文件: C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\string
注意: 包含文件: C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\istream
注意: 包含文件: C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\ostream
注意: 包含文件: C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\ios
注意: 包含文件: C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocnum
注意: 包含文件: C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\climits
注意: 包含文件: C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\yvals.h
注意: 包含文件: C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\crtdefs.h
注意: 包含文件: C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\sal.h
是这样。
而XAPDEP 是怎么处理的捏?
/* clean up the dependencies and write them to the makefile */
ch = INSET;
endch = strlen( buf );
/* skip space */
while ( (ch < endch) && (buf[ch] != '\r') && (buf[ch] == ' ') )
{
ch ++;
}
fputs( objfile, outmak );
fputs( ".obj : \"", outmak );
while ( (ch < endch) && (buf[ch]!='\r') )
{
putc( buf[ch++], outmak );
}
fputs( "\" \r\n", outmak );
很简单,先去掉字符串的前INSET个字符(这里的INSET值为22),这样“注意: 包含文件: ”的长度不够,造成路径的前几个字符也一并截取掉了。
解决办法:
1.改小INSET的值。 最贱的是改成ch = strlen ( "注意: 包含文件:" );
2.重写XAPDEP,做成一个更健壮易用的程序。
从别人博客转的,但是我试了一下有点问题,最正确的做法是直接将deps.d文件中的《《《《注意: 包含文件:》》》》》
前缀取出来放到ch = strlen()的参数中,这个应该是多语言造成的,很恶心啊。
原文:http://blog.csdn.net/deyafoo/article/details/14593805