xapian 1.2.x在VC下编译问题的浅析(可能是一)

这几日想研究下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,做成一个更健壮易用的程序。

你可能感兴趣的:(xapian)