没有优化的gcc会出错(但我必须省略-o以启用gdb函数)

时间:2011-09-16 20:01:18

标签: c gdb

我想在没有-o优化的情况下编译我的c代码(比如$ gcc -g test test.c),我认为代码不会导致问题,因为我测试了如下的简单代码,它不会工作要么:

#include<stdio.h>
main()
{
    printf("hello\n");
}

我得到了一大堆错误:

test: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crt1.o:(.text+0x0): first d   efined here
test:(.rodata+0x0): multiple definition of `_fp_hw'
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crt1.o:(.rodata+0x0): first defined here
test: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crti.o:(.fini+0x0): first defined here
test:(.rodata+0x4): multiple definition of `_IO_stdin_used'
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crt1.o:(.rodata.cst4+0x0): first defined here
test: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crt1.o:(.data+0x0): first defined here

我用谷歌搜索,发现那是因为我没有放-o那里。但我必须,否则像“print var”这样的命令在gdb上不起作用。无论如何我可以解决这个问题吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您所做的是以下内容:

gcc -o test test.c

创建可执行测试(-o表示输出转到参数,在本例中为test)。对于优化,您使用-O(大写O)。

现在你做:

gcc -g test test.c

告诉gcc使用-g开关进行编译(启用调试符号)并使用文件testtest.c进行编译。因此,您的错误消息是由gcc尝试编译可执行文件test而产生的,这显然不是C源文件。只需键入以下内容即可获得类似的结果:

gcc test

改为运行

gcc -g -o test test.c

正如评论中已经建议的那样。

答案 1 :(得分:0)

你正在考虑-O标志,(大写字母“O”),它控制着优化。 -o标志只是为您的可执行文件命名。如果未指定该标志,则可执行文件将自动命名为a.out

我想你可能会不小心输入类似

的内容
gcc -g test.c test.c

会导致重复的符号错误,就像上面显示的那样。正确的gcc调用是:

gcc -g -o test test.c

如果您希望获得最大调试信息,请尝试-ggdb3而不是-g

答案 2 :(得分:0)

如果要完全禁用优化,则默认优化级别为-O1, 你还必须将-O0传递给gcc,即字母大写O和数字零。