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属性。

时间: 2024-12-28 23:56:46

gcc编译规则的相关文章

GCC 编译详解 (转)

朋友用C调用lua的库,但是不能直接调用源码,必须要编译成静态链接库才可以使用,问学长说是因为要分开编译链接.这就不理解了,于是转一篇讲编译的文章学习一下,补补课… GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Java.Fortran.Pascal.Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种

万年历算法的实现(C语言--gcc编译)

/** cal.c * * 现行的格里历是从儒略历演化而来的.儒略历每4年一个润年,润年366天,平年365天.* 如果从公元1年算的话,那么凡是能够被4整除的都是润年.从天文角度看,儒略历这种 * 历法是有误差的,到16世纪误差已经达到了10天.1582年,罗马教皇对儒略历进行了 * 一次校定,该年的10-5到10-14这10天被抹掉,并规定凡不能被400整除的世纪年不再 * 算为润年,校定之后的儒略历即为现行的格里历. * * 但是英国直到1752年才开始使用格里历,此时时间误差已经达到了1

gcc编译, gdb调试, makefile写法

//test.c: #include <stdio.h> int main(void) { printf("hello world!"); return 0; } ====================================== 一. 1. 编译过程:预处理(processing)->编译(compilation)->汇编(assembly)->Linking 2. 预处理: gcc -E test.c -o test.i / gcc -E t

[转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链

GCC 编译优化指南

前言 网上关于编译优化的文章很多,但大多零零散散,不成体系,本文试图给出一个完整和清晰的优化思路,同时提供在实践中如何进行优化的详尽参考.但是,在介绍所有优化知识之前首先引用LFS-Book中的一句忠告:"使用编译器优化得到的小幅度性能提升,与它带来的风险相比微不足道".你还要进行优化吗? %@&#=^%~*# ... OK, crazy guy! Let's Go!! 在继续之前,作者还是奉劝各位:如果追求极致的优化,那么它将是一件既耗时又麻烦的事情,你会陷入无止尽的测试.测

整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题

分类: MakeFile/Make/GCC/LD2010-11-20 23:15 535人阅读 评论(0) 收藏 举报 转者的话: 本文详细介绍了gcc 编译时 搜索头文件的路径以及方式, 编译时寻找lib库的方式, 以及运行时加载库的寻找方式!!!非常之经典啊!以后有新的知识都汇总到这里来了! 在交叉编译的时候我们需要用到其他的库,在config时候可以通过“-I”来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法. 看下文的红色部分. 有大量的环境变量可供设置以影响 G

GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链接阶段到底做了什么) 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标

GCC 编译优化指南【转】

转自:http://www.jinbuguo.com/linux/optimize_guide.html 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. 无担保:本文作者不保证作品内容准确无误,亦不承担任何由于使用此文档所导致的损失. 自由使用:任何人都可以自由的阅读/链接/打印此文档,无需任何附加条件. 名誉权:任何人都可以自由的转载/引用/再创作此文档,但必须保留作者署名并注明出处. 其他作品 本文作者十分愿意与他人分享劳动成果,如果你对我的其他

GCC编译过程与动态链接库和静态链接库

1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib)和动态库(.so..dll). windows上对应的是.lib .dll linux上对应的是.a .so 在这里先介绍下Linux下的gcc编译的几个选项 g++ -c hellospeak.cpp 会将hellospeak.cpp 选