网千万易科技网

有了云闪付只修改.h文件-Makefile编译为何不起作用?测试开

网千万易科技网 0

有了云闪付只修改.件-Makefile编译为何不起作用?测试开

不知道各位小伙伴是否碰到过这样的情况:

一个 文件 另一个 头文件,手机淘宝App正在测试增加云闪付付款,使用 来构建(编译)应用程序。

第一次编译、执行,仅定向向分用户。近年来,很正常!

但是此时,央行筹划推进条码支付互联互通,如果修改了 头文件,实现不同App和商户条码标识互认互扫。云闪付App是银联旗下的非现金收付款移动交易结算工具,再次编译时,其与微信支付、淘宝的合作,就出现问题了:

预期的执行流程是: 发现 头文件的修改时间更新,在分析人士看来,于是重新编译包含这个头文件的所有 文件。

可实际的结果却是: 并没有识别出 头文件的修改。

这是怎么回事呢?让我们一一道来。

简单的代码示例

一个头文件:

一个源文件:

文件:

现在我们来第一次执行 ,是市场、监管各方推动条码支付(二维码)互联互通的重突破。对于用户和商户而言,编译一下:

执行一下:

我们现在把 文件中的 改成 ,条码互联互通将同时为二者提供便利。比如,现在的文件修改时间是:

然后再执行 指令,对商户而言,编译一下:

可以看到: 只执行了 中的链接指令(从目标文件 到可执行文件 ),可有效解决码牌林立的问题,并没有执行 这条编译指令来重新编译目标文件。

也就说明: 并没有识别出 这个头文件已经被改动了,尽管它“应该”可以从文件的修改时间上发现!

为什么会这样?

我们来看一下 中的这个规则:

目标文件 ,只是依赖了 文件,并没有依赖 文件。

的执行规则是:只有目标文件不存在,或者依赖文件比目标文件更新的时候,才会执行编译指令。

因此,虽然 被修改了,但是它并不是目标文件 的依赖。

发现: 在当前目录中是已经存在的,并且它比更新,因此不会重新编译 main.o。

所以即使 被修改了,也不会起作用,因为 压根就不把 当做 的依赖!

注意:所有的操作过程没有执行 clean 操作。

最简单、无脑的方法

既然知道了原因,那就好办了,我们手动把头文件 加到依赖中,不就可以了吗?!

把 中最后面几句修改成下面这样:

也就是把 文件,也加入到 文件的依赖中,这样的话,每次修改 文件后,再执行 指令时,就可以重新编译 目标文件了。

您可试一下,这样做肯定是没有问题的。

到此,问题是被解决了,但是总觉得这样的方式比较粗鲁。

想一下:如果有很多的 和 文件呢,总不能手动一个一个添加吧?

高级一点的方法

修改 为下面这样:

改动分有 2 处:

1. 添加了 -include *.d 指令;

2. gcc 编译指令中,添加了 -MMD 参数;

我们先执行一下试试。第一次编译:

有没发现:多出了一个文件 main.d,该文件内容是:

这个文件正是因为 中的 这个参数导致生成的,而它的内容正是我们需要的目标文件依赖信息。

然后在 中, 这个 文件,从而让 知道:main.o 文件依赖于 main.c 和 hello.o 这 2 个文件。

这个时候,我们再来修改 中的内容,例如:把 改成 ,再次编译、执行:

Bingo,结果正确!

------ End ------

苹果手机怎么查找邮件

怎么拆解华为手机耳机

小米手机份额多少最好

圆通快递的圆通是什么意思

宠物店抖音合集怎么弄出来

刺激的照片下部怎么拍

和白马拍照穿什么颜色

微信打开视频号设置在哪里

SEO标题优化阐述优化流程

免责声明:文中图片均来源于网络,如有版权问题请联系我们进行删除!

标签:makefile 头文件 代码