请选择 进入手机版 | 继续访问电脑版

[LINUX] Linux GCC常用下令 详解

[复制链接]
查看77 | 回复16 | 2021-9-5 02:50:50 | 显示全部楼层 |阅读模式

1. 简介

GCC 的意思也只是 GNU C Compiler 而已。颠末 了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它如今 还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另一方面,说到 GCC 对于操作体系 平台及硬件平台支持,概括起来就是一句话:无所不在。

2. 简单编译

示例程序如下:

//test.c #include int main(void) { printf("Hello World!\n"); return 0; }

这个程序,一步到位的编译指令是:

gcc test.c -o test

实质上,上述编译过程是分为四个阶段举行 的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和毗连 (Linking)。

2.1 预处理

gcc -E test.c -o test.i 或 gcc -E test.c

可以输出test.i文件中存放着test.c经预处理之后的代码。打开test.i文件,看一看,就明确 了。后面那条指令,是直接在下令 行窗口中输出预处理后的代码。

gcc的-E选项,可以让编译器在预处理后制止 ,并输出预处理效果 。在本例中,预处理效果 就是将stdio.h 文件中的内容插入到test.c中了。

2.2 编译为汇编代码(Compilation)

预处理之后,可直接对天生 的test.i文件编译,天生 汇编代码:

gcc -S test.i -o test.s

gcc的-S选项,表示在程序编译期间,在天生 汇编代码后,制止 ,-o输出汇编代码文件。

2.3 汇编(Assembly)

对于上一末节 中天生 的汇编代码文件test.s,gas汇编器负责将其编译为目的 文件,如下:

gcc -c test.s -o test.o

2.4 毗连 (Linking)

gcc毗连 器是gas提供的,负责将程序的目的 文件与所需的全部 附加的目的 文件毗连 起来,终极 天生 可实行 文件。附加的目的 文件包括静态毗连 库和动态毗连 库。

对于上一末节 中天生 的test.o,将其与C标准输入输出库举行 毗连 ,终极 天生 程序test

gcc test.o -o test

在下令 行窗口中,实行 ./test, 让它说HelloWorld吧!

3. 多个程序文件的编译

通常整个程序是由多个源文件构成 的,相应地也就形成了多个编译单元,利用 GCC可以或许 很好地管理这些编译单元。假设有一个由test1.c和 test2.c两个源文件构成 的程序,为了对它们举行 编译,并终极 天生 可实行 程序test,可以利用 下面这条下令 :

gcc test1.c test2.c -o test

假如 同时处理的文件不止一个,GCC仍然 会按照预处理、编译和链接的过程依次举行 。假如 穷究 起来,上面这条下令 大致相称 于依次实行 如下三条下令 :

gcc -c test1.c -o test1.o gcc -c test2.c -o test2.o gcc test1.o test2.o -o test

4. 检错

gcc -pedantic illcode.c -o illcode

-pedantic编译选项并不能保证被编译程序与ANSI/ISO C标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目的 越来越近。或者换句话说,-pedantic选项可以或许 帮助程序员发现一些不符合 ANSI/ISO C标准的代码,但不是全部,究竟 上只有ANSI/ISO C语言标准中要求举行 编译器诊断的那些环境 ,才有大概 被GCC发现并提出告诫 。

除了-pedantic之外,GCC还有一些别的 编译选项也可以或许 产生有用 的告诫 信息。这些选项大多以-W开头,此中 最有价值的当数-Wall了,利用 它可以或许 使GCC产生尽大概 多的告诫 信息。

gcc -Wall illcode.c -o illcode

GCC给出的告诫 信息固然 从严格 意义上说不能算作错误,但却很大概 成为错误的居住 之所。一个良好 的Linux程序员应该只管 避免产生告诫 信息,使本身 的代码始终保持标准、健壮的特性。以是 将告诫 信息当成编码错误来对待,是一种值得歌颂 的活动 !以是 ,在编译程序时带上-Werror选项,那么GCC会在全部 产生告诫 的地方制止 编译,迫使程序员对本身 的代码举行 修改,如下:

gcc -Werror test.c -o test

5. 库文件毗连

开辟 软件时,完全不利用 第三方函数库的环境 是比较少见的,通常来讲都必要 借助很多 函数库的支持才可以或许 完成相应的功能。从程序员的角度看,函数库实际 上就是一些头文件(.h)和库文件(so、或lib、dll)的集合。\。固然 Linux下的大多数函数都默认将头文件放到/usr/include/目次 下,而库文件则放到/usr/lib/目次 下;Windows所利用 的库文件重要 放在Visual Stido的目次 下的include和lib,以及体系 文件夹下。但也有的时间 ,我们要用的库不再这些目次 下,以是 GCC在编译时必须用本身 的办法来查找所必要 的头文件和库文件。

比方 我们的程序test.c是在linux上利用 c毗连 mysql,这个时间 我们必要 去mysql官网下载MySQL Connectors的C库,下载下来解压之后,有一个include文件夹,内里 包含mysql connectors的头文件,还有一个lib文件夹,内里 包含二进制so文件libmysqlclient.so

此中 inclulde文件夹的路径是 /usr/dev/mysql/include ,lib文件夹是 /usr/dev/mysql/lib

5.1 编译成可实行 文件

起首 我们要举行 编译test.c为目的 文件,这个时间 必要 实行

gcc –c –I /usr/dev/mysql/include test.c –o test.o

5.2 链接

末了 我们把全部 目的 文件链接成可实行 文件:

gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test

Linux下的库文件分为两大类分别是动态链接库(通常以.so末端 )和静态链接库(通常以.a末端 ),二者的区别仅在于程序实行 时所需的代码是在运行时动态加载的,还是在编译时静态加载的。

5.3 逼迫 链接时利用 静态链接库

默认环境 下, GCC在链接时优先利用 动态链接库,只有当动态链接库不存在时才思量 利用 静态链接库,假如 必要 的话可以在编译时加上-static选项,逼迫 利用 静态链接库。

在/usr/dev/mysql/lib目次 下有链接时所必要 的库文件libmysqlclient.so和libmysqlclient.a,为了让GCC在链接时只用到静态链接库,可以利用 下面的下令 :

gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test

静态库链接时搜刮 路径次序 :

1. ld会去找GCC下令 中的参数-L

2. 再找gcc的环境变量LIBRARY_PATH

3. 再找内定目次 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

动态链接时、实行 时搜刮 路径次序 :

1. 编译目的 代码时指定的动态库搜刮 路径

2. 环境变量LD_LIBRARY_PATH指定的动态库搜刮 路径

3. 设置 文件/etc/ld.so.conf中指定的动态库搜刮 路径

4. 默认的动态库搜刮 路径/lib

5. 默认的动态库搜刮 路径/usr/lib

有关环境变量:

LIBRARY_PATH环境变量:指定程序静态链接库文件搜刮 路径

LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜刮 路径


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 上善若水8L8 | 2021-9-18 21:09:05 | 显示全部楼层
楼上的很有激情啊!
回复

使用道具 举报

avatar 枣强公用号 | 2021-9-18 21:09:08 | 显示全部楼层
admin楼主你想太多了!
回复

使用道具 举报

avatar 凡八哥 | 2021-9-19 06:45:34 | 显示全部楼层
宇宙第一贴诞生了!
回复

使用道具 举报

avatar 珍惜637 | 2021-9-19 07:06:42 | 显示全部楼层
好帖子!
回复

使用道具 举报

avatar 一段或九段肝 | 2021-10-1 18:40:17 | 显示全部楼层
楼上的能详细介绍一下么?
回复

使用道具 举报

avatar 梦的衣裳323 | 2021-10-4 07:05:25 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

avatar 易网随缘倚 | 2021-10-4 18:43:26 | 显示全部楼层
今天是个特别的日子,值得纪念!
回复

使用道具 举报

avatar 爱无声爱留痕列 | 2021-10-10 01:45:51 | 显示全部楼层
楼上长在线啊?
回复

使用道具 举报

avatar 叶小琛小m | 2021-10-13 12:31:25 | 显示全部楼层
上次给admin楼主开的药,你都吃完了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则