type
status
date
slug
summary
tags
category
icon
password

用GCC编译执行C/C++程序

GCC简介

GCC原名GNU C Complier,最初GCC只能用于处理C语言程序。随着GCC的不断扩展,它逐渐支持C++、Fortran、Pascal、Objective-C、java、Ada以及Go等程序设计语言的开发。GNU C Complier 也随之变成了GNU Compiler Collection,成为类Unix及Mac OS X操作系统的标准编译器,尤其是它的C/C++语言编译器,成为跨平台编译器的事实标准。
在终端输入命令gcc -version或者gcc -v,查询当前系统安装GCC版本。
下面介绍利用GCC进行C/C++程序设计的方法。使用GCC对源文件进行处理的具体过程如下(以源文件test.c为例)
  1. 在预处理阶段,GCC对test.c文件中的文件包含、预处理等语句进行处理。该阶段会生成一个名为test.i的中间文件。
  1. 在编译阶段,以test.i 文件作为输入,编译后生成汇编语言文件test.s
  1. 在汇编阶段,以test.s文件作为输入,生成目标文件test.o
  1. 在链接阶段,将所有的目标文件和程序中用到的库函数连接到可执行程序中正确的位置,形成二进制代码文件。

GCC的使用

GCC的基本知识

GCC是基于命令行的编译器,很多复杂的操作经过若干条命令就可以完成。
GCC的文件扩展名约定
扩展名
类 型
可以进行的后续操作
.c
C 语言源程序
预处理、编译、汇编
.cpp
C++ 源程序
预处理、编译、汇编
.m
Objective-C 源程序
预处理、编译、汇编
.i
预处理后的 C 文件
编译、汇编
.ii
预处理后的 C++ 文件
编译、汇编
.s
预处理后的汇编语言源程序
汇编、连接
.S
未预处理的汇编语言源程序
预处理、汇编
.h
预处理器文件
程序包含的头文件
.o
编译后的目标文件
传递给连接器
.a
已编译的库文件
传递给连接器

GCC的基本用法

最基本的命令格式如下
gcc [选项] [文件名] (注意 在gcc命令中,各部分之间一定要保留空格,并且严格区分大小写)
gcc test.c
选项
含义
示例
-c
对源文件进行编译,但不连接为可执行文件,仅生成扩展名为.o的目标文件
gcc -c test.c
-o  文件名
将GCC处理的结果保存在指定文件中,该文件的扩展名可能是.i、.s或者.o、.out 。若省略该选项,则生成系统默认的文件a.out。使用-o选项时,必须跟一个文件名
gcc -o test.c
-E
对源文件只做预处理,不编译
gcc -E test.c  -o  test.c
-O[2]
对源代码进行基本的优化,-O2比-O对编译和连接过程的优化程度更高,优化编译和连接的过程相对较慢
gcc -o -O test test.c
-g
编译时加入调试信息,以方便后期对程序进行调试
gcc -g -c test test.c
此外还有很多选项可以在终端输入man gcc命令进行查看。
以源代码文件test.c 为例:
  1. 在预处理阶段,输入的是C语言的源文件,通常扩展名为.c。他们通常是带有.h头文件的包含文件。这个阶段主要处理源文件中的#ifdef、#include、#define命令。该阶段会生成一个中间文件(*.i),但实际工作中通常不用专门生成中间文件。若必须生成中间文件,输入命令gcc -E test.c -o test.i
  1. 在编译阶段,输入的是中间文件,编译后生成汇编语言文件(*.s)。这个阶段对应的GCC命令如下:gcc -S test.i -o test.s
  1. 在汇编阶段,将输入的汇编语言文件转换成机器语言文件(*.o)。这个阶段对应的GCC命令如下:gcc -c test.s -o test.o
  1. 在链接阶段将输入的机器语言文件与其他的机器语言文件和库文件汇集一个可执行的二进制代码文件。这个步骤用这个命令: gcc test.c -o test
  1. 如果GCC不使用-E、-S、-c 等选项,仅使用-o选项 则GCC 将从源代码文件直接生成可执行文件,在此过程中产生的中间文件被GCC删除。命令为gcc test.c -o test
    1. notion image
 
一个c++例子:
notion image

GNU的调试程序—gdb

gdb是GNU发布的C/C++程序的调试工具。gdb通过命令行的方式显示程序在运行时的内部结构和内存的使用情况。
一般来说,用户利用gdb命令行方式可以完成的一些功能如下:
  • 设置断点,调试程序,可以查看此时程序中变量的值
  • 逐行执行程序代码,并可以动态改变程序的执行环境
为了使gdb正常工作,程序在编译时必须包含调试信息,因此在编译时用-g选项加入调试信息。启动Linux下 的终端,在命令行输入gdb命名,如果出现"(gdb)"提示符,表明gdb启动成功。也可以通过输入gdb -h命令得到一个有关这些选项的简单说明以c++为例:g++ -g baolimeiju.cpp -o baolimeiju
notion image
Python数据分析(转载)从源代码中学习(初学者成长的有效途径)