C 语言编译器的作用是将 C 程序的源码翻译成特定计算机硬件上可执行的二进制文件。
在默认 C 程序的编译与运行发生在同一环境的前提下,根据可执行文件运行的环境可以将 C 语言编译器分为桌面操作系统和嵌入式操作系统两大类。
桌面操作系统上的 C 语言编译器
桌面操作系统上常用的 C 语言编译器有:
- Visual C++
- GCC
- Clang
当前主流的三类桌面操作系统及其上常用的编译器为:
- Windows: Visual C++ / GCC / Clang
- Unix/Linux: GCC / Clang
- OS X/iOS: Clang
Visual C++ (简称 MSVC ) 是微软开发的 C 编译器,只能用于 Windows 系统。
MSVC 是非开源软件,个人用户可以通过社区版 Visual Studio 免费使用该编译器。
但是未经微软授权, MSVC 不能应用到商业化产品。
GCC(GNU Compiler Collection/GNU 编译器套件) 是由 GNU 开发的编译器。
GNU 编译器套件包括 C、C++、 Objective-C、 Fortran、Java、Ada 和 Go 语言前端, 也包括了这些语言的库。
GCC 的初衷是为 GNU 操作系统专门编写的一款编译器。
Clang 编译器是 LLVM 项目的一部分,由于该项目是在 Apple 主推下发展的,所以在 OS X 系统中,Clang 编译器又被称为 Apple LLVM 编译器。
GCC 和 Clang 可用于 Windows 系统,但主要用于 Unix/Linux 系统。
GCC 与 Clang 编译器编译出的可执行程序一般没有任何限制,应用程序可以随意发布和商用。
嵌入式系统上的 C 语言编译器
不同型号的嵌入式设备常常需要对应的配套编译器,常见的有:
- Keil C51: Keil公司的 51 系列单片机
- AVR GCC: Arduino 开发板
- ADS、RVDS、DS-5 Studio: ARM 架构设备
- CCS: TI 公司的 DSP 设备
- Visual DSP++: ADI 公司的 DSP 设备
Windows 系统安装 GCC 的方法
GCC 的初衷是为 GNU 操作系统专门编写一款编译器, 现已被大多数类 Unix 操作系统(如 Linux、BSD 等)采纳为标准的编译器。
在 Windows 系统上使用 GCC 编译器需要借助 MinGW(Minimalist GCC for Windows) 提供一组包含文件和端口库,好让控制台模式的程序能够使用微软的标准C运行时库(C Runtime/MSVCRT.DLL)。
从 MinGW Download 可以下载 MinGW-get 程序。
MinGW-get 是 MinGW 的一个包管理程序, 用来管理各类包含文件与端口库。
安装好需要的包后即可在 Windows 终端上调用 GCC 来编译指定源码。
GCC 的基本使用方法
GCC 的详细用法可以参考 GCC Manual 。此处简单介绍 GCC 的基本用法。
GCC 编译的基本语法为:
gcc [options] [filenames]
其中[options]
是输入参数,[filenames]
是各输入/输出文件名。
GCC 编译的常用参数包含:
-
[-c]
只编译, 不链接成可执行文件; 输入源代码*.c
文件, 输出*.o
目标文件; 常用于编译不含主程序的子程序文件。 -
[-o OUTPUT_FILENAME]
GCC 默认输出的可执行文件名为a.out
; 此参数可将输出文件名设置为OUTPUT_FILENAME
,GCC 要求设置文件名不能和源文件同名。 -
[-g]
产生符号调试工具 (GDB) 所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。 -
[-O]
编译过程中对程序进行优化; 在编译、链接采用这个选项,源代码会在编译、链接过程中被编译器优化处理,以产生执行效率更高的可执行程序; 但编译、链接的速度会相应降低。 -
[-O2]
编译器会执行比-O
更深度的优化, 同时编译速度也更慢。 -
[-I DIRNAME]
将DIRNAME
指示的目录加入到程序头文件目录列表中;用于预编译过程。 -
[-v]
打印出 GCC 相关程序的版本号以及编译器执行时的详细过程信息; 此参数可用于查看 GCC 搜索头文件及库文件时使用的搜索路径。
(注)
C 程序有两种预编译指令可用于包含头文件
#include <stdio.h>
#include "stdio.h"
使用尖括号包含头文件时, 编译器在预编译时会在系统路径包含的目录中搜索该文件; 使用双引号包含头文件时,编译器会在源码文件所在的文件夹中搜索该文件。
GCC 相关文件
*.h
程序所包含的头文件;*.c
C 源代码文件;*.i
C 源代码文件且不应进行预处理;*.o
编译后的目标文件(Object File);*.a
目标文件构成的档案库文件;*.out
链接后输出的可执行文件;*.C / *.cc / *.cxx
C++ 源代码文件且必须要经过预处理;*.ii
C++ 源代码文件且不应进行预处理;*.m
Objective-C 源代码文件;*.mm
Objective-C++ 源代码文件;*.s
汇编语言源代码文件;*.S
经过预编译的汇编语言源代码文件。