前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文件被多个中间文件输出目录相同的工程包含

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

作者头像
零式的天空
发布2022-03-24 14:36:51
8110
发布2022-03-24 14:36:51
举报
文章被收录于专栏:零域Blog

case

两个工程 Proj1 和 Proj2,同时包含 demo.cpp,其中 Proj1 在工程配置里预定义宏 MACRO_PROJ1,Proj2 在工程配置里预定义宏 MACRO_PROJ2,两个工程的中间文件输出目录为同一个,文件 demo.cpp 内容如下:

代码语言:javascript
复制
#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!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • case
  • analysis
  • confirmation
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档