一般用法:
(1)编译.c文件:
gcc -o example example.c
(2)编译.cpp文件:
gcc -o example example.cpp -lstdc++
或者:
g++ -o example example.cpp
或者:
c++ -g -o example example.cpp
详细说明:
在使用GCC编译器的时候,我们必须给出一系列必要的调用参数和文件名称。
GCC编译器的调用参数大约有100多个,这里只介绍其中最基本、最常用的参数。具体可参考GCC Manual。
GCC最基本的用法是∶
gcc [options] [filenames]
其中options就是编译器所需要的参数,filenames给出相关的文件名称。
-c 只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename 确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-g 产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
-O 对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。
-O2 比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。
-Idirname 指明源码内include文件所在的目录。将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
1) #include <myinc.h>
2) #include “myinc.h”
其中,1)类使用尖括号(< >),2)类使用双引号(“ ”)。对于1)类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而2)类,预处理程序在目标文件的文件夹内搜索相应文件。
-lm 表示使用函数库libm.a(或libm.so),可以拆成两部分来看:
-l:加入某个函数库(library);
m:则是libm.so,其中,lib与扩展名(.a或.so)不需要写;
-Ldirname 指明需要的函数库的搜索目录dirname。Linux默认是将函数库放在/lib和/usr/lib当中,所以-L/lib和-L/usr/lib可以省略不写。
例:
gcc sin.c -lm -L/lib -L/usr/lib -I/usr/include
#这个命令较常执行在最终链接成 binary file 的时候;
#-lm 指的是 libm.a 或 libm.so 这个函数库文件;
#-L 后面接的路径是刚才上面那个函数库的搜索目录;
#-I 后面接的是源码内 include 文件所在的目录;
-Wall 指明程序的编译变的更严谨,所有的警告都会显示出来。
-v gcc执行时执行的详细过程,gcc及其相关程序的版本号。原版gcc manual该选项英文解释是:Print (on standard error output) the commands executed to run the stages of compilation. Also print the version number of the compiler driver program and of the preprocessor and the compiler proper. 编译程序时加上该选项可以看到gcc搜索头文件/库文件时使用的搜索路径。
基本规则:
gcc所遵循的部分约定规则:
.c 为后缀的文件,C语言源代码文件;
.a 为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理;
.h 为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是C源代码文件且不应该对其执行预处理;
.ii 为后缀的文件,是C++源代码文件且不应该对其执行预处理;
.m 为后缀的文件,是Objective-C源代码文件;
.mm 为后缀的文件,是Objective-C++源代码文件;
.o 为后缀的文件,是编译后的目标文件;
.s 为后缀的文件,是汇编语言源代码文件;
.S 为后缀的文件,是经过预编译的汇编语言源代码文件;
参考: