我想在没有-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上不起作用。无论如何我可以解决这个问题吗?
谢谢!
答案 0 :(得分:3)
您所做的是以下内容:
gcc -o test test.c
创建可执行测试(-o
表示输出转到参数,在本例中为test
)。对于优化,您使用-O
(大写O)。
现在你做:
gcc -g test test.c
告诉gcc
使用-g
开关进行编译(启用调试符号)并使用文件test
和test.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和数字零。