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

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!
发布了235 篇原创文章 · 获赞 39 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/mzlogin/article/details/9150539