gcc开始使用gcc


备注

GCC(大写)是指GNU编译器集合。这是一个开源编译器套件,包括C,C ++,Objective C,Fortran,Ada,Go和Java的编译器。 gcc(小写)是GNU编译器集合中的C编译器。从历史上看,GCC和gcc可以互换使用,但正在努力将这两个术语分开,因为GCC包含的编译工具比C更多。

本节中的文档将引用gcc,GNU C编译器。目的是提供常见操作和选项的快速查找。 GCC项目在https://gcc.gnu.org上有详细的文档,其中包括安装,一般用法和每个命令行选项。有关此处未回答的任何问题,请参阅GCC官方文档。如果GCC文档中的某个主题不清楚,请索取具体示例。

版本

发布日期
7.1 2017年5月2日
6.3 2016年12月21日
6.2 2016年8月22日
5.4 2016年6月3日
6.1 2016年4月27日
5.3 2015年12月4日
5.2 2015-07-17
5.1 2015年4月22日
4.9 2014年4月22日
4.8 2013年3月22日
4.7 2012-03-22
4.6 2011-03-25
4.5 2010-04-14
4.4 2009-04-21
4.3 2008-03-05
4.2 2007-05-13
4.1 2006-02-28
4 2005-04-20
3.4 2004年4月18日
3.3 2003-05-13
3.2 2002-08-14
3.1 2002-05-15
3.0 2001-06-18
2.95 1999年7月31日
2.8 1998年1月7日
2.7 1995年6月16日
2.6 1994年7月14日
2.5 1993年10月22日
2.4 1993年5月17日
2.3 1992年10月31日
2.2 1992年6月8日
2.1 1992年3月24日
2.0 1992年2月22日
1.42 1992年9月20日
1.41 1992年7月13日
1.40 1991年6月1日
1.39 1991年1月16日
1.38 1990年12月21日
1.37 1990年2月11日
1.36 1989年9月24日
1.35 1989年4月26日
1.34 1989年2月23日
1.33 1989年2月1日
1.32 1988年12月21日
1.31 1988年11月19日
1.30 1988年10月13日
1.29 1988年10月6日
1.28 1988年9月14日
1.27 1988年9月5日
1.26 1988年8月18日
1.25 1988年8月3日
1.24 1988年7月2日
1.23 1988年6月26日
1.22 1988年5月22日
1.21 1988年5月1日
1.20 1988年4月19日
1.19 1988年3月29日
1.18 1988年2月4日
1.17 1988年1月9日
1.16 1987年12月19日
1.15 1987年11月28日
1.14 1987年11月6日
1.13 1987年10月12日
1.12 1987年10月3日
1.11 1987年9月5日
1.10 1987年8月22日
1.9 1987年8月18日
1.8 1987年8月10日
1.7 1987年7月21日
1.6 1987年7月2日
1.5 1987年6月18日
1.4 1987年6月13日
1.3 1987-06-10
1.2 1987-06-01
1.1 1987年5月24日
1.0 1987年5月23日
0.9 1987年3月22日

“你好,世界!”使用常见的命令行选项

对于具有单个源文件的程序,使用gcc很简单。

/* File name is hello_world.c */
#include <stdio.h>

int main(void)
{
    int i;
    printf("Hello world!\n");
}
 

要从命令行编译文件hello_world.c:

gcc hello_world.c
 

然后gcc将编译程序并将可执行文件输出到文件a.out。如果要命名可执行文件,请使用-o选项。

gcc hello_world.c -o hello_world
 

然后,可执行文件将命名为hello_world而不是a.out。默认情况下,gcc发出的警告不多。 gcc有很多警告选项,最好查看gcc文档以了解可用的内容。使用'-Wall'是一个很好的起点,涵盖了许多常见问题。

gcc -Wall hello_world.c -o hello_world
 

输出:

hello_world.c: In function ‘main’:
hello_world.c:6:9: warning: unused variable ‘i’ [-Wunused-variable]
     int i;
         ^
 

在这里,我们看到我们现在得到一个警告,即变量'i'被声明但在函数中根本没有使用。

如果您打算使用调试器来测试程序,则需要告诉gcc包含调试信息。使用'-g'选项调试支持。

gcc -Wall -g hello_world.c -o hello_world
 

hello_world现在具有GDB支持的调试信息。如果使用其他调试器,则可能需要使用不同的调试选项,以便正确格式化输出。有关更多调试选项,请参阅官方gcc文档。

默认情况下,gcc编译代码以便于调试。 gcc可以优化输出,以便最终的可执行文件产生相同的结果但性能更快,并且可能导致更小的可执行文件。 '-O'选项可以进行优化。在O之后添加几个可识别的限定符以指定优化级别。每个优化级别都添加或删除一组命令行选项。 '-O2',' - os',' - O0'和'-Og'是最常见的优化级别。

gcc -Wall -O2 hello_world.c -o hello_world
 

'-O2'是生产就绪代码的最常见优化级别。它在性能提升和最终可执行文件大小之间提供了出色的平衡

gcc -Wall -Os hello_world.c -o hello_world
 

'-Os'类似于'-O2',除了可以通过增加可执行文件大小来提高执行速度的某些优化被禁用。如果最终的可执行文件大小对您很重要,请尝试'-Os'并查看最终可执行文件中是否存在明显的大小差异。

gcc -Wall -g -Og hello_world.c -o -hello_world
 

请注意,在上面的'-Os'和'-O2'示例中,删除了'-g'选项。那是因为当你开始告诉编译器优化代码时,某些代码行本质上不再存在于最终的可执行文件中,这使得调试变得困难。但是,也存在仅在启用优化时才会发生某些错误的情况。如果要调试应用程序并让编译器优化代码,请尝试使用'-Og'选项。这告诉gcc执行所有不应妨碍调试体验的优化。

gcc -Wall -g -O0 hello_world.c -o hello_world
 

'-O0'执行的优化比'-Og'更少。这是gcc默认使用的优化级别。如果要确保禁用优化,请使用此选项。

确定gcc版本

在提到gcc的文档时,您应该知道正在运行的gcc版本。 GCC项目为每个版本的gcc都有一本手册,其中包含在该版本中实现的功能。使用'-v'选项确定您正在运行的gcc的版本。

gcc -v
 

示例输出:

Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)
 

在这个例子中,我们看到我们正在运行gcc版本5.3.1。然后,您将知道参考GCC 5.3手册。如果您遇到特定于版本的问题,在提问时也可以包含您的gcc版本。