GNU 编译器套件(GCC,GNU
Compiler Collection)最初的目标是作为一款 GNU
操作系统的通用编译器,包含有
C、C++、Objective-C、Objective-C++、Fortran、Ada、Go、BRIG(HSAIL)等语言的前端及其相关的libstdc++、libgcj等库,目前已经移植到
Windows、Mac OS X 等商业化操作系统。GCC
编译器套件当中包含了诸多的软件包,主要的软件包如下面表格所示:
名称
描述
cpp
C 预处理器。
gcc
C 编译器。
g++
C++ 编译器。
gccbug
用于创建 BUG 报告的 Shell 脚本。
gcov
覆盖测试工具,用于分析程序需要优化的位置。
libgcc
GCC 运行库。
libstdc++
标准 C++库。
libsupc++
C++语言支持函数库。
Ubuntu、Mint 等使用 deb 格式软件包的 Linux 发行版通常会默认安装 GCC
编译器,但是由于相关的软件包可能并不完整,因此可以通过如下命令安装完整的
GCC 编译环境。
1
sudo apt-get install build-essential
基本使用
由于当前需要编译的是 C
语言程序,因此需要使用到gcc软件包提供的命令,这些命令的基本使用格式如下:
1
gcc [-options] [filename]
将上一节编写的 Hello World
程序保存至一个main.c源代码文件当中,然后执行gcc编译命令得到可执行的a.out文件:
1 2 3 4 5 6
➜ gcc main.c ➜ ls a.out main.c
➜ ./a.out hello world!
如果需要指定输出的可执行文件名称,那么可以添加-o选项:
1 2 3 4 5 6
➜ gcc main.c -o main ➜ ls main main.c
➜ ./main hello world!
编译信息
如果需要查看编译的过程,那么可以使用-v命令选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
➜ gcc -v main.c Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) COLLECT_GCC_OPTIONS='-v''-mtune=generic''-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/7/cc1 -quiet -v -imultiarch x86_64-linux-gnu main.c -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase main -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/cc9yluga.s GNU C11 (Ubuntu 7.3.0-27ubuntu1~18.04) version 7.3.0 (x86_64-linux-gnu) compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP ... ...
上面的步骤比较繁琐,可以将汇编和链接两条命令合并为一条命令,编译
C 语言代码的同时得到.so动态链接库文件。
1 2 3 4 5
➜ ls func1.c func2.c main.c ➜ gcc -fpic -shared func1.c func2.c -o libmain.so ➜ ls func1.c func2.c main.c libmain.so
指定编译规范
由于 GCC 同时支持多套 C
程序语言规范,因而编译时可以通过选项指定当前需要遵循的语言规范,具体请参考下表:
规范
规范
选项
补充
C89 / C90
ANSI C (X3.159-1989) 或 ISO/IEC
9899:1990
-std=c90
-std=iso9899:1990、-ansi
C94 / C95
95 年发布的 C89/C90
修正版,此次修正通常称作 AMD1
-
-std=iso9899:199409
C99
ISO/IEC 9899:1999
-std=c99
-std=iso9899:1999
C11
ISO/IEC 9899:2011
-std=c11
-std=iso9899:2011
GNU C89 / C90
带 GNU 扩展的 C89/C90
-std=gnu90
-
GNU C99
带 GNU 扩展的 C99
-std=gnu99
-
GNU C11
带 GNU 扩展的 C11
-std=gnu11
-
例如下面代码当中,指定了 GCC 的编译过程遵循 C89/C90
规范,结果编译时提示错误信息:C++ style comments are not allowed in ISO C90。
1 2 3 4 5 6 7
➜ gcc main.c -std=c90
main.c: In function ‘main’: main.c:7:36: error: C++ style comments are not allowed in ISO C90 printf("hello world!\n"); // 行注释 ^ main.c:7:36: error: (this will be reported only once per input file)
缺省情况下,GCC 默认使用的是-std=gnu11规范,即携带 GNU
扩展的 C11 标准。
【GDB】概述
GNU 项目调试器(GDB,GNU
Project Debugger)是一款可以调试
Ada、汇编、C++、D、Fortran、Go、Objective-C、OpenCL、Modula-2、Pascal、Rust
等多种语言的跨平台程序调试工具。为了捕获程序中的各类 Bug,GNU
项目调试器可以胜任下面 4 方面的工作:
启动程序,并指定能够影响其行为的任意内容。
在指定条件下停止程序的执行。
当程序停止时,检查发生了什么问题。
通过修改程序中的内容,从而尝试修复 bug。
向 Linux 命令控制台键入gdb即可运行 GDB 调试程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
➜ gdb
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty"for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration"for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type"help". Type "apropos word" to search for commands related to "word". (gdb) |
aliases -- Aliases of other commands breakpoints -- Making program stop at certain points data -- Examining data files -- Specifying and examining files internals -- Maintenance commands obscure -- Obscure features running -- Running the program stack -- Examining the stack status -- Status inquiries support -- Support facilities tracepoints -- Tracing of program execution without stopping the program user-defined -- User-defined commands
Type "help" followed by a class name for a list of commands in that class. Type "help all"for the list of all commands. Type "help" followed by command name for full documentation. Type "apropos word" to search for commands related to "word". Command name abbreviations are allowed if unambiguous.