我试图验证我的宏在ubuntu中通过md5sum命令进行编译时是否真的有效。
例如,通过“nvcc -DTEST_MACRO ....”我得到了一个可执行文件A. 然后通过“nvcc ...”我得到了一个可执行文件B. 当然,md5的值是不同的。 但是,我重新编译并再次生成A.它的md5与之前的不同。
我使用纯c ++代码并使用g ++进行检查,无论我编译多少次,它的md5值都是相同的。所以我认为nvcc生成的可执行文件中有时间戳。
答案 0 :(得分:3)
我认为这种可变性不一定是由于嵌入式时间戳,而是由nvcc
构建可执行文件的方式。
nvcc
是一个编译器驱动程序,这意味着它会在“引擎盖下”启动一系列命令来编译代码。在执行此序列期间,将使用随机生成的文件名创建各种临时文件。您可以通过查看添加了nvcc
开关的-v
编译命令的输出来了解这一点。
其中一些文件名 do 嵌入在可执行文件中,并且由于这些随机生成的文件名从nvcc
编译命令的一次调用到下一次调用,所以生成的二进制文件将而变化。
如果您想自己验证,请添加nvcc
运行-v
命令。然后检查末尾的输出是否为tmpxft...
文件名。然后grep生成该文件名的可执行文件,例如:
grep tmpxft_0000a76e myexe
(将tmpxft_0000a76e
替换为nvcc
详细输出中显示的内容,并将myexe
替换为可执行文件的实际名称。)
如果您想验证TEST_MACRO是否真的有效,可以选择几种方法。最不具侵入性的可能是将以下行放在TEST_MACRO主体中:
#ifdef TEST_MACRO
...
#warning TEST_MACRO_COMPILED
...
#endif
当您指定-DTEST_MACRO
(以上是一种有用的技术,可以避免错误地包含调试宏以及您在生产/发布代码构建中不需要的其他内容。)
当然,可能还有很多其他可能性。如果测试宏包含可执行代码,您可以在其中放置printf
语句,以便在运行时查看证据。