文件被多个中间文件输出目录相同的工程包含

来源:互联网 发布:数学必修三编程软件 编辑:程序博客网 时间:2024/06/05 19:45
case:
  两个工程Proj1和Proj2,同时包含demo.cpp,其中Proj1在工程配置里预定义宏MACRO_PROJ1,Proj2在工程配置里预定义宏MACRO_PROJ2,两个工程的中间文件输出目录为同一个,文件demo.cpp内容如下:
#include <stdio.h>  int main(){#ifdef MACRO_PROJ1      printf("output by proj1");#elif defined MACRO_PROJ2      printf("output by proj2");#endif          return 0;}
  然后编译两工程生成Proj1.exe和Proj2.exe,期望的结果是Proj1.exe输出output by proj1,Proj2输出output by proj2,但是……意外发生了:
  会发现一定的概率下,两个exe输出的内容相同,至于是output by proj1还是output by proj2则比较随机。

analysis:
  在出问题的情况下,既然Proj1.exe和Proj2.exe输出一致,那么可以推测生成两个exe的源中间文件demo.obj是一样的,明明在两个工程里根据宏定义,预编译过后的源代码是不一样的,怎么会出现生成的obj文件一样的情况呢?联想到编译器的“懒惰”特性,推测出发生问题的情况如下:
  假设首先编译Proj1,那么预编译过后,源文件里生效的应该是printf("output by proj1");这一行,生成demo.obj,然后链接生成Proj1.exe;然后在编译Proj2时,编译器会先对比demo.cpp和demo.obj的时间戳,发现demo.obj的修改时间比较新,那么就不用重新编译,就将之前生成的demo.obj直接用于链接生成了Proj2.exe。

confirmation:
  更改Proj1与Proj2两个工程的中间文件输出目录为两个不同的目录,问题不再发生。 
  Done!
原创粉丝点击