在GCC中使用-Wall -Wextra并获得错误

时间:2013-08-16 02:22:37

标签: c gcc linker-errors ld

我不确定为什么我收到这些错误,当我使用GCC进行编译并且不使用-Wall-Wextra时程序编译正常。但是,当我使用标志-Wall-Wextra时,我收到编译错误。

这是我跑的测试程序:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main(void)
{
    return 0;
}

...以下是我从中得到的错误:

/home/definity/Desktop/Cloud/code/funcptr: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here
/home/definity/Desktop/Cloud/code/funcptr: In function `data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o:(.data+0x0): first defined here
/home/definity/Desktop/Cloud/code/funcptr: In function `data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o:(.data+0x0): first defined here
/home/definity/Desktop/Cloud/code/funcptr:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o:(.rodata.cst4+0x0): first defined here
/home/definity/Desktop/Cloud/code/funcptr: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined here
/home/definity/Desktop/Cloud/code/funcptr: In function `main':
/home/definity/Desktop/Cloud/code/funcptr.c:35: multiple definition of `main'
/tmp/cctHUnUj.o:/home/definity/Desktop/Cloud/code/funcptr.c:9: first defined here
/home/definity/Desktop/Cloud/code/funcptr: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o:(.init+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtend.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__'
/home/definity/Desktop/Cloud/code/funcptr:(.data+0x10): first defined here
/usr/bin/ld: error in /home/definity/Desktop/Cloud/code/funcptr(.eh_frame); no .eh_frame_hdr table will be created.
collect2: error: ld returned 1 exit status
[Finished in 0.1s with exit code 1]

......我无法解释这些错误。有人可以解释为什么会出现这些错误以及我可以采取哪些措施来防止将来发生这种错误?

1 个答案:

答案 0 :(得分:2)

基于this link

    -Wall
            This enables all the warnings about constructions that some users consider 
questionable, and that are easy to avoid (or modify to prevent the warning), even in 
conjunction with macros. This also enables some language-specific warnings described in C++ Dialect Options and Objective-C and Objective-C++ Dialect Options.

            -Wall turns on the following warning flags:

                      -Waddress   
                      -Warray-bounds (only with -O2)  
                      -Wc++11-compat  
                      -Wchar-subscripts  
                      -Wenum-compare (in C/ObjC; this is on by default in C++) 
                      -Wimplicit-int (C and Objective-C only) 
                      -Wimplicit-function-declaration (C and Objective-C only) 
                      -Wcomment  
                      -Wformat   
                      -Wmain (only for C/ObjC and unless -ffreestanding)  
                      -Wmaybe-uninitialized 
                      -Wmissing-braces (only for C/ObjC) 
                      -Wnonnull  
                      -Wparentheses  
                      -...

            Note that some warning flags are not implied by -Wall. Some of them warn about 
        constructions that users generally do not consider questionable, but which occasionally you might wish to check for; others warn about constructions that are necessary or hard to
    avoid in some cases, and there is no simple way to modify the code to suppress the warning. 
    Some of them are enabled by -Wextra but many of them must be enabled individually.