码迷,mamicode.com
首页 > 其他好文 > 详细

gcc编译规则

时间:2015-05-25 10:18:59      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:gcc

GCC即GNU Compiler Collection,GNU编译器套件,包括C/C++等多种语言。在使用GCC编译器的时候,我们必须给出一系列必要的调用参数和文件名称。

1、下面介绍一些最基本、最常用的参数。

GCC最基本的用法是:gcc [options] <filenames>

其中,options就是编译器所需要的参数,filenames给出相关的文件名称。

-E,让编译器在预处理后停止,并输出预处理器结果。

-pedantic,警告不符合ANSI/ISO的C语言标准的代码。

-Wall,产生警告信息,但不能算作错误。

-Werror,在所有产生警告的地方停止编译,当作错误来处理。

-I,指定头文件所在的文件夹。

-L,指定函数库所在的文件夹。

-static,强制链接时使用静态链接库(.a),相关的环境变量时LIBRARY_PATH。默认情况下,GCC在链接时优先使用动态链接库(.so),相关的环境变量时LD_LIBRARY_PATH。

-fpic,意为位置独立代码,指示编译程序生成的代码要适合共享库的内容,这样的代码能够根据载入内存的位置计算内部地址。

-c,只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名,如果不给出这个选项,gcc就给出预设的可执行文件a.out。

-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。

-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。

-O2,比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。

-llibname,指定库名字,例如libhello.a,libname只需hello即可。

-v,gcc执行时执行的详细过程,gcc及其相关程序的版本号。

2、GCC文件后缀遵循一定的约定规则,如下:

.c,C语言源代码文件。

.a,是由目标文件构成的库文件。

-C、.cc、.cpp,是C++源代码文件且必须要经过预处理。

.h,是程序所包含的头文件。

.i,是C源代码文件且不应该对其执行预处理。

.ii,是C++源代码文件且不应该对其执行预处理。

.m,是object-c源代码文件。

.mm,是object-c++源代码文件。

.o,是编译后的目标文件。

.s,是汇编语言源代码文件。

.S,是经过预编译的汇编语言源代码文件。

3、gcc编译的几个阶段

以main.c为例:

// main.c
#include <stdio.h>
 
int main(void)
{
    printf("hello world\n");
 
    return 0;
}

第一,预编译过程

这个过程处理宏定义和include,并做语法检查。

gcc –E main.c –o main.i

第二,编译过程

这个过程生成汇编代码。

gcc –S main.i –o main.s

第三,汇编过程

这个过程生成目标代码。

gcc –c main.s –o main.o

第四,链接过程

这个过程生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。

gcc main.o –o main

最后,运行程序

./main

hello world

4、编译静态库和动态库

例子,将hello.c和hello2.c分别编译成静态库libhello.a和动态库libhello.so。

第一,编译静态库

gcc –c hello.c hello2.c

ar –r libhello.a hello.o hello2.o

ar是个实用的文件打包工具。

第二,编译动态库

gcc –c –fpic hello.c hello2.c

gcc –shared hello.o hello2.o libhello.so

5、__attribute__

__attribute__机制是GNU的一大特色,用来设置函数属性、变量属性和类型属性。前后都有两个下划线,后面紧跟一对圆括号,圆括号里面的是其参数。语法格式如下:

__attribute__((attribute-list))

例如visibility,用于设置动态链接库中函数的可见性,将变量或函数设置为hidden,则该符号仅在本so中可见,在其它库中则不可见。g++在编译时,可用参数-fvisibility指定所有符号的可见性,不加此参数时默认外部可见。若要对特定函数的可见性进行设置,需在代码中使用__attribute__设置visibility属性。

 

gcc编译规则

标签:gcc

原文地址:http://blog.csdn.net/ieearth/article/details/45953355

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!