最近面试的时候,有人问了GCC编译选项的问题,回顾顺便整理一下。
其实我更想说的是,一般做项目的话都是有写自己的Makefile吧,基本上写过一次都可以用好久了是吧!
在使用GCC
编译器的时候,我们必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,这里只介绍其中最基本、最常用的参数。具体可参考GCC Manual。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是编译器所需要的参数,filenames给出相关的文件名称。
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
-O2,比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。
-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在
预编译过程中使用的参数。C程序中的头文件包含两种情况∶
A)#include <myinc.h>
B)#include “myinc.h”
其中,A类使用尖括号(< >),B类使用双引号(“ ”)。对于A类,
预处理程序cpp在系统预设包含
文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在
目标文件的文件夹内搜索相应文件。
-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++
源代码文件;
.s为后缀的文件,是
汇编语言源代码文件;
.S为后缀的文件,是经过
预编译的汇编语言源代码文件。