0%

Linux程序设计-gcc编译器 [总结概况版][复习专用][速通]

导航

当前章节:gcc编译器
原文链接:gcc编译器
上一章节:Linux文本编辑
下一章节:shell脚本
目录:Linux程序设计

gcc

前言

本章内容较为简单,主要是了解linux的自带编译器GCC。GCC代表GNU编译器集合。它是一种广泛使用的编译器,用于将以各种语言编写的源代码编译为各种体系结构的二进制代码,主要为C和C++服务。

编译器的作用是通过编译器将文本类型的源码通过编译先转为汇编语言,最终转为机器语言让机器能够执行。

关于编译器的详细内容可以参考计算机组成原理中对计算机语言的介绍。

编译流程

源程序文本.c-预处理器预处理(cpp)>处理后程序文本.i-ccl编译(as)>汇编程序文本.s-汇编>可执行二进制程序.o-ld链接>可执行文件

gcc 编译c源程序,g++编译cpp程序

GCC编译

预处理-编译-汇编-链接
gcc -E x.c -o x.i
gcc -S x.i -o x.s
gcc -c x.s -o x.o
gcc x1.o x2.o -o x

g++链接方式

程序可以通过链接的方式将多个程序文件进行链接,能够简化开发的复杂程度。

链接包括静态和动态链接两种方式

链接命令有

  1. g++ 静态链接库

ar是创建gcc静态库文件的指令
格式:ar [选项] [归档文件] [目标文件…]

选项参数:
c:创建一个新的归档文件,如果文件已存在则覆盖。
r:向归档文件中添加目标文件。如果目标文件已经存在于归档文件中,则替换它。
u:只将比目标文件新的文件添加到归档文件中。
d:从归档文件中删除指定的目标文件。
t:显示归档文件中的所有成员(目标文件)的列表。
x:从归档文件中提取指定的成员(目标文件)。

示例:
ar crv libx.a x2.o 创建一个libx.a的具体库,其中包含了 x2.o 这个目标文件,crv表示覆盖替换和显示详细信息
g++ x1.o libx.a -o x 使用g++将x1.o程序链接一个libx.a静态库(我们刚才创建的)并将链接后的可执行文件保存为x

如果将该链接库libx.a删除,该程序仍能执行,因为静态链接是直接把该静态库加入到该程序源码了。

  1. g++ 动态链接库

首先创建一个共享库:
g++ [filename.o…] -fPIC -shared -o libname.so

g++ x2.o -fPIC -shared -o libx.so
-fPIC -shared 两个是将文件生成共享库的参数
该指令将x2.o作为一个共享库,当前目录生成libx.so。将so文件移动至/usr/lib的系统依赖库目录中或其它目录。
Linux有多个共享库目录,其中,对于linux系统,/lib是内核级的,/usr/lib是系统级的,/usr/local/lib是用户级的

g++ x1.o -L/usr/lib -lx -o x
将x1.o与libx动态链接生成x,链接后可执行,删除后不能运行

  1. gcc简易链接指令
    gcc myprogram.c -lX 动态链接libX.so
    默认在以下路径寻找,可直接链接 - /lib- /usr/lib- /usr/local/lib

指定路径链接:
gcc myprogram.c /path/to/libx.so
gcc myprogram.c -L/path/to/ -lx

多依赖库链接 gcc myprogram.c -lx -ly
链接头文件 gcc myprogram.c -I/path/to/includes -lx
完整链接 gcc myprogram.c -I/usr/include -L/usr/lib -lx