WINCE6.0编译找不到lib的问题(SYNCHRONIZE_DRAIN=1)

发现一个奇怪的问题,在A和B电脑上编译同一个BSP,A电脑OK,B电脑经常编译报错,错误信息如下:

don't know how to make 'D:\WINCE600\platform\CW2451\lib\ARMV4I\retail\s3c2450_lcdc_lib.lib'

详细信息如下:

BUILD: [00:0000003078:PROGC ] Building LIBPass in D:\WINCE600\PLATFORM\CW2451\SRC\DRIVERS\DISPLAY\s3c2450_lcdc_lib\directory.

BUILD: [02:0000003097:PROGC ] LinkingD:\WINCE600\platform\CW2451\lib\ARMV4I\retail\s3c2450_ldi_lib.lib

BUILD: [00:0000003099:WARNN ] File:D:\WINCE600\platform\CW2451\lib\ARMV4I\retail\s3c2450_lcdc_lib.lib does notexist (2).

BUILD: [00:0000003100:WARNN ] File:D:\WINCE600\platform\CW2451\lib\ARMV4I\retail\s3c2450_cf_atapi.lib does notexist (2).

BUILD: [00:0000003110:PROGC ] Building LIBPass in D:\WINCE600\PLATFORM\CW2451\SRC\DRIVERS\DISPLAY\S3C2450_VIDEO_DRV\directory.

BUILD: [00:0000003123:PROGC ] Building LIBPass in D:\WINCE600\PLATFORM\CW2451\SRC\DRIVERS\DISPLAY\G2D_LIB\ directory.

BUILD: [01:0000003126:PROGC ] LinkingD:\WINCE600\platform\CW2451\lib\ARMV4I\retail\s3c2450_lcdc_lib.lib

BUILD: [02:0000003143:ERRORE] NMAKE :  U1073: don't know how to make'D:\WINCE600\platform\CW2451\lib\ARMV4I\retail\s3c2450_lcdc_lib.lib'

BUILD: [02:0000003145:ERRORE] NMAKE.EXETargetLibFiles  -i -c BUILDMSG=Stop.  BUILDROOT=D:\WINCE600\PLATFORM\CW2451CLEANBUILD=1 LINKONLY=1 NOPASS0=1 failed - rc = 2.

其中s3c2450_lcdc_lib.lib 是由DRIVERS\DISPLAY\S3C2450_LCDC_LIB编译生成的,DISPLAY驱动中S3C2450_VIDEO_DRV会链接s3c2450_lcdc_lib.lib,根据上面的error信息,刚开始还以为是没有编译生成s3c2450_lcdc_lib.lib,但在WINCE600\platform\CW2451\lib\ARMV4I\retail目录下是可以找到此lib文件的。

 

可以看到上面一行信息BUILD: [00:0000003099:WARNN ] File:D:\WINCE600\platform\CW2451\lib\ARMV4I\retail\s3c2450_lcdc_lib.lib does notexist (2).

,警告信息说明build.exe在此时是没有发现s3c2450_lcdc_lib.lib的。接下来编译S3C2450_VIDEO_DRV,而S3C2450_VIDEO_DRV是需要链接s3c2450_lcdc_lib.lib的,所以就产生了这个编译出错信息。

 

我们找到sources文件中SYNCHRONIZE_DRAIN=1的相关说明:http://msdn.microsoft.com/zh-cn/ms924476,可知,如果我们用于编译的开发机有多个处理器(多核),WINCE6.0的编译工具build.exe就可能同时创建不同的线程来编译不同的目录。在这种情况下,我们就要保证正确的编译顺序,否则就可能出现上面的错误。下来看DISPLAY的dir文件内容:

DIRS=\
    s3c2450_ldi_lib \
    s3c2450_lcdc_lib \
    s3c2450_video_drv \
    g2d_lib \
    s3c2450_disp_drv \

可以看出s3c2450_video_drv是在其依赖的s3c2450_lcdc_lib之后编译的,但很有可能是负责编译s3c2450_lcdc_lib的处理器在编译还没有生成s3c2450_lcdc_lib.lib的时候,另一个处理器就去编译s3c2450_video_drv目录了,所以就产生了上面的问题。

 

如何避免此问题呢?可在s3c2450_video_drv目录的sources文件中增加SYNCHRONIZE_DRAIN=1,这样就可以确保build.exe先编译其他目录,然后再编译带有SYNCHRONIZE_DRAIN=1的目录,这样就可以解决此问题。

你可能感兴趣的:(WINCE6.0编译找不到lib的问题(SYNCHRONIZE_DRAIN=1))