gcc 编辑器基本使用
简介
gcc是由GNU开发的编程语言编辑器。gcc原本作为GNU操作系统的官方编辑器,现已被大多数类unix操作系统(如linux、BSD、Mac OS X等)采纳为标准的编辑器,gcc同样适用于微软的windows。
一、gcc常用选项
在终端(Ubuntu)输入gcc --help,查看gcc有哪些选项
常用的有:
- -o <file> 指定生成的输出文件名为file
- -E 只进行预处理
- -S 只进行预处理和编译
- -c 只进行预处理、编译和汇编
- -v 查看gcc版本
- -g 包含调试信息
- -On n=0-3 编译优化,n越大优化越多
- -Wall 提示更多警告信息
- -D 编译时定义宏
- -static 静态连接
不使用任何选项,将文件输出为可执行文件
1、-o -E -S -c选项 的使用
创建一个hello.c的文件进行编辑
文件里写入hello程序,保存退出。
使用gcc -E将hello.c文件预处理,并输出到hello.i文件:
使用gcc -S生成汇编文件,输出到hello.s:
使用gcc -c 生成目标文件,输出到hello.o:
使用gcc不加任何选项生成可执行文件:
执行hello测试:
执行成功。
注意:以上所有中间步骤都可以跳过,
比如:可以让hello.c直接转化为可执行文件
使用gcc -s 让hello.i文件生成hello1.s
2、gcc对多个.c文件进行编译
如下图,我已经准备好了加减乘除的函数:
加法函数的头文件和.c文件如下:
其他函数类似,在main.c中:
此时便可以使用通配符*,直接输出可执行文件:
二、静态库和动态库
首先简单介绍一下动态库和静态库:
- 静态库和动态库的载入时间是不一样的。
- 静态库的代码在编译的过程中已经载入到可执行文件中,所以最后生成的可执行文件相对较大。
- 动态库的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,所以最后生成的可执行文件相对较小。
(1)静态链接:由链接器在链接时将库的内容加入到可执行程序中。
优点:对运行环境的依赖性较小,具有较好的兼容性
缺点:
- 生成的程序比较大,需要更多的系统资源,在装入到内存时会消耗更多的时间
- 库函数有了更新,必须重新编译应用程序
(2)动态链接:链接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序
优点:
- 在需要的时候才会调入对应的资源函数
- 简化程序的升级;较小的程序体积
- 实现进程之间的资源共享(避免重复拷贝)
缺点:
- 依赖动态库,不能独立运行
- 动态库依赖版本问题严重
1、静态库
静态库的创建
静态库的命名(libxxx.a)规则:
- 前缀:lib
- 库名称:自己定义(做到见名知其意)
- 后缀.a
源文件(.h, .c等)需要先进行预编译、编译、汇编,生成目标文件(二进制文件)之后,通过ar工具进行编号、索引、压缩打包,创建成libxxx.a文件(静态库)。ar工具需要添加参数:rcs:
- r更新
- c创建
- s建立索引
使用第一章节的第二小节中的例子,将加减乘除的.c文件用gcc -c生成它们的目标文件(.o)
然后使用rm命令将目标文件打包成.a文件
此时静态库便创建成功!
静态库使用测试
静态库的使用需要依赖文件和所有的头文件,首先把所有的.o和加减乘除的.c函数全部删除,删除之后只有以下文件了:
在上图中,使用了gcc命令生成了可执行文件,并执行成功,说明测试成功了,下面说一下几个选项的作用
- -I./ 指定当前目录。注:这里是小写L
- -L./ 指定库所在的目录
- -ltest -l表示指定库的名称,test为静态库的名称(去掉lib和.a)
2、动态库
动态库的创建
动态库命名(libxxx.so)规则:
- 前缀:lib
- 库名称:自己定义
- 后缀:.so
还是使用上一个例子
第一步:同样需要先生成目标文件,与静态库创建不同的是,需要加入-fpic选项
参数-fpic创建与地址无关的编译程序(pic, positon independent code)
第二步:生成共享库,加上链接器选项:-shared(指定生成动态链接库)
此时可以通过nm命令查看对应的函数
动态库使用测试
与静态库测试一样,先删除加减乘除的.o和.c文件
删除之后如下:
尝试先使用与静态库相同的方式生成可执行文件
发现此时报错,找不到共享对象文件,也就是找不到这个libtest.so,这是因为生成这个可执行文件有个链接器,但是链接器并不知道这个库在这(因为这里使用的是相对路径)。以下为解决方式
1、将库拷贝到标准库文件夹中去(不推荐)
使用sudo cp libtest.so /lib
然后使用gcc命令:
此时并不需要-L指定库所在目录了,我们发现这种方式成功运行了。
2、临时设置环境变量
需要添加绝对路径
这种方式是临时的,也就是退出终端之后再进入之后就不生效了。
3、永久设置
配置~/.bashrc或者/etc/profile,环境变量相关问题可以查找其他相关资料,这里不详细说明了。
4、将其添加到/etc/ld.so.conf文件(链接器的配置文件)中
加入新行-动态库所在的绝对路径
sudo ldconfig -v,该命令会重建/etc/ld.so.cashe文件(使链接器的配置文件生效)
5、使用软连接
将库文件链接到lib文件夹中