linux gcc常用命令详解 【百科全说】-凯发k8官方旗舰厅

腾讯视频/爱奇艺/优酷/外卖 充值4折起

  linux gcc常用命令详解

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凯发app官网登录官网下载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环境变量:指定程序动态链接库文件搜索路径

linux下ps命令详解 linux下ps命令的详细使用方法

06/29 16:38
linux下ps命令详解 linux上进程有5种状态:1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 5. 停止(进程收到sigstop, sigstp, sigtin, sigtou信号后停止运行运行) ps工具标识进程的5种状态码:d 不可中断 uninterrupti

linux下ps命令详解

07/29 23:55
linux下ps命令详解 linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 5. 停止(进程收到sigstop, sigstp, sigtin, sigtou信号后停止运行运行) ps工具标识进程的5种状态码: d 不可中断 uninterrup

linux/ubuntu chmod命令详解使用格式和方法

05/27 00:07
在 ubuntu linux 中用源码文件安装软件时经常都会用到chmod命令来更改文件的权限使其在安装时有执行的权限。由于 ubuntu linux 默认不能用root账户来登录所以在用chmod命令来更改文件的权限时往往需要结合sudo命令来使用,如果你对sudo命令还不太了解,请先看看本站的《sudo命令详解》 chmod linux/ubuntu 系统中文件调用的权限分为三级:文件拥有者(u)、群组(g)、其他(o)。用chmod就可以更改文件的权限。chmod是一个相当灵活的命令,对同
08/30 07:22
证书 证书是一个经证书授权中心签过名的包含公钥及公钥拥有者信息的文件.证书授权中心(ca)对证书签名的过程即为证书的颁发过程.证书里面的公钥只属于某一个实体(网站,个人等),它的作用是防止一个实体伪装成另外一个实体. 证书可以保证非对称加密算法的合理性,假设a和b的通话过程如下: a -------> hello (plain text) ---------> b a <------- hello (plain text) ---------- b a <------ b send
05/22 11:14
用法: rar <命令> -<选项1> ….-<选项n> <操作文档> <文件…> <@文件列表…> <解压路径> 通常rar命令由一个主命令加若干选项(可选)构成,操作文档为操作施加的.rar文件对象, 文件或文件列表为对操作文档实现修饰的具体文件或目录(可选)。 ------------------------------------------------------------------------ r
05/30 20:00
1.命令格式: cat [选项] [文件]... 2.命令功能: cat主要有三大功能: 1.一次显示整个文件:cat filename 2.从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件. 3.将几个文件合并为一个文件:cat file1 file2 > file 3.命令参数: -a, --show-all 等价于 -vet -b, --number-nonblank 对非空输出行编号 -e 等价于 -ve -e, --show-ends 在每行结束处显
12/29 07:41
在你准备使用linux系统作为网站服务器系统之前,我建议大家先学习一些基本的linux系统的操作命令,这些命令都是在日常操作中和配置linux服务器网络环境时要用到的,了解和掌握这些命令,将有助于你更好的使用linux服务器.本文将以centos 6.5为例简单讲解一下linux系统下常用的基本操作命令. 首先大家可以使用virtualbox安装一个centos6.5系统,或者直接购买一个安装了centos系统的云主机,国内推荐阿里云,橙云主机其实也不错,不过我个人在使用过程中感觉速度不是很理想
10/05 03:21
一、注意事项 命令和参数之间必需用空格隔开,参数和参数之间也必需用空格隔开。 一行不能超过256个字符;大小写有区分。 二、特殊字符含义 文件名以“.”开头的都是隐藏文件/目录,只需在文件/目录名前加“.”就可隐藏它。 ~/ 表示主目录。 ./ 当前目录(一个点)。 ../ 上一级目录(两个点)。 ; 多个命令一起用。 > >> 输出重定向 。将一个命令的输出内容写入到一个文件里面。如果该文件存在, 就将该文件的内容覆盖; 如果不存在就先创建该文件, 然后再写入内容。 输出重定
01/05 12:40
yum是一个用于管理rpm包的后台程序,用python写成,可以非常方便的解决rpm的依赖关系。在建立好yum服务器后,yum客户端可以通过http、ftp方式获得软件包,并使用方便的命令直接管理、更新所有的rpm包,甚至包括kernel的更新。它也可以理解为红旗环境下的apt管理工具。 以前写过一份[原]使用yum更新红旗linux,但其中提到的命令不是很完整,现再整理一下。 一、列举包文件 列出资源库中所有可以安装或更新的rpm包 #yumlist 列出资源库中特定的可以安装或更新以及已经安
网站地图