文件被多个中间文件输出目录相同的工程包含
来源:互联网 发布:数学必修三编程软件 编辑:程序博客网 时间:2024/06/05 19:45
case:
两个工程Proj1和Proj2,同时包含demo.cpp,其中Proj1在工程配置里预定义宏MACRO_PROJ1,Proj2在工程配置里预定义宏MACRO_PROJ2,两个工程的中间文件输出目录为同一个,文件demo.cpp内容如下:
会发现一定的概率下,两个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!
两个工程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!
- 文件被多个中间文件输出目录相同的工程包含
- 如何改变工程编译输出文件的目录
- 输出编译器预处理器的中间文件
- VS工程中如何在其它目录下的文件中包含stdafx.h的问题
- 附加包含目录 同一个解决方案下,使用不同工程的头文件
- 包含文件的目录书写方式
- 输出当前包含过的文件
- MyEclipse6.5通过Hibernate逆向工程生成的映射文件和pojo(bean)不在相同目录解决
- 删除目录下相同文件
- log4j.xml文件输出到web工程相对路径的log目录
- VC6工程目录下的文件说明
- VC6工程目录下的文件说明
- cmd 输出文件目录
- java 输出一个目录下所有文件信息(包含子文件)
- 删除目录下相同文件的python代码(逐级优化)
- 【Bash脚本】删除两个目录下相同的文件
- mk拷贝后缀相同的文件到指定目录命令
- 输出两个文件中不同/相同的行
- 源码编译CEF3
- C#随机产生10位大写字母的字符串
- getDateStr,Date类型,转化,日期
- java 改变窗体状态(最大化、最小化、正常)
- 找不到 System.Windows.Ria的解决办法
- 文件被多个中间文件输出目录相同的工程包含
- 基于opencv的手势识别
- H.264学习(一)——帧和场的概念(zz)
- spket插件的安装与使用完整图文版
- OpenGL学习(1)-基础知识(2)
- 熬之滴水穿石:JSP--HTML中的JAVA代码(7)
- codeforces 2B The least round way
- 电子商务基础1
- ajax学习篇9