在编译过程中警告中显示的对象文件名在编译过程的每次调用时都会更改

时间:2014-08-04 06:12:42

标签: c linux gcc

我正在编译一个函数并收到警告:

**/tmp/ccPFK7nG.o: warning gets is dangerous and should not be used.**

现在我知道为什么警告即将来临,我不知道的部分是警告来自哪里的位置不断变化。 每次编译代码时,位置都是 /tmp/some_file.o 是否像gcc在/ tmp目录中创建了临时目标文件,并且在创建可执行文件时将其从那里删除?

3 个答案:

答案 0 :(得分:2)

  

每次编译代码时,位置都是/tmp/some_file.o就像gcc在/ tmp目录中创建临时目标文件一样,当可执行文件生成时,它会从那里删除它吗?

您看到的是gcc中-flto选项的副作用,它可以启用链接时优化。第二遍的编译源确实是临时的,包含来自目标文件的预编译数据。

要查看真正的罪魁祸首,您可能需要删除此选项并重新编译,尽管警告应在第一遍中显示正确的文件位置。

答案 1 :(得分:1)

建议删除gets()的使用情况。由于ISO C11从C语言中删除了gets()的规范。

http://linux.die.net/man/3/gets

阅读 BUGS 符合部分。

答案 2 :(得分:1)

如果同时编译和链接,例如

gcc a.c b.c c.c -o wholeprogram

每个提到的C模块都被编译成一个临时的目标文件,然后所有目标文件被链接在一起以获得最终的可执行文件。

这些临时obejct文件的名称是动态创建的,因此会在每次调用时更改。