Linux环境中C语言的开发环境和工具----gcc
➢ 在Linux中,GNU(GNU,名称来自Gnu's Not Unix\"的缩写,一个类UNIX的操作系统,由GNU计划推动,目标在于创建一个完全兼容于UNIX的自由软件环境。) tools是主要的程序的开发工具,其最重要的组成部分是GCC(GNU Compliler Collection)
➢ GCC能完成从C C++ Objective-C等源文件向运行在特定CPU硬件上的目标代码的转换。对于通用计算机,使用GCC生成x86的可执行代码;对于嵌入式开发系统,使用交叉编译的GCC,生成目标机可以执行的程序。
➢ GCC对默认文件的处理包含了文本文件和二进制文件两种。
1. 文本文件包括:
*.c
*.i
*.s
*.h
2. 二进制文件包括
*.o 目标文件
*.so 动态库
*.a 静态库
➢ GCC是一组工具的组合,包含预处理器、编译器、汇编器、连接器等部分。
➢ GCC生成应用程序分为四步
1. 预处理,生成.i文件(预处理器cpp) -E
2. 编译,将预处理的文件转换为汇编语言,生成.s文件(编译器gcc) -S
3. 汇编,将汇编代码生成目标代码,即机器代码,生成.o文件(汇编器as) -c
4. 连接,由各个文件的目标代码,生成可执行程序(连接器ld)
5. (课本p41 图4-1)
➢ 在一般gcc程序的生成过程中,从C语言到最终的可执行程序,主要分两个阶段:
1. 就各个C语言的源文件生成目标文件*.o
2. 将各个目标文件进行连接生成可执行程序
➢ gcc常用的参数:
1. –o FILE 指定输出文件的文件名
2. –g 表示包含调试信息
3. –Wall 输出所有的警告
4. –IDIRECTORY 指定搜索头文件的路径
5. –llibrary 指定连接库文件
6. –LDIRCTORY 指定连接库所需要的路径
7. –static 生成静态连接的可执行程序
➢ 动态库
1. 使用gcc连接工具可以生成动态库,动态库的扩展名一般为*.so
2. 态库存在
动态库不需要被连接到可执行程序中,不会增加可执行程序的大小,但是运行的时候仍然需要动
3. 修改环境变量 /etc/profile(对所有用户有效) /root/.bashrc(对当前用户有效)
4. export LD_LIBRARY_PATH=./:$ LD_LIBRARY_PATH
5. source .bashrc
6. 动态库举例(main.c myavg.c mysum.c a.h)
gcc myavg.c mysum.c -c (生成myavg.o 和 mysum.o )
gcc myavg.o mysum.o -o libtest.so -shared
(生成libtest.so)
gcc main.c -o main -L /root/linux_c/gcc -ltest (生成main可执行文件)
➢ gcc的二进制工具
1. ar(归档工具),ar工具用于建立、修改、提取归档文件(archive),一个归档文件是包含多个
目标文件的单个文件,它也被称为静态库。
2. gcc工具系列中,ar工具常用于生成静态库文件,静态库生成后,可直接被应用程序连接
-r 表示库中插入模块,同名时替换
-v 显示执行操作选项的附加信息
-t 查看静态库内容
-d 删除库中的成员
-x 提取静态库文件中的各个目标文件
在静态库文件中,a表示追加文件,r表示替换文件
3. 静态库举例(main.c myavg.c mysum.c a.h)
gcc myavg.c mysum.c –c (生成myavg.o 和 mysum.o)
ar -rv libtest.a myavg.o mysum.o (生成libtest.a)
ar -t libtest.a
ar -d libtest.a myavg.o
ar -rv libtest.a myavg.o mysum.o
(查看myavg.o mysum.o显示的标记)
ar -x libtest.a
gcc main.c -o main -L /root/linux_c/gcc/ -ltest
静态库和动态库的基本概念: 静态库,是在可执行程序连接时就已经加入到执行码中,在物
理上成为执行程序的一部分;使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生成的可执行文件较大。动态库,是在可执行程序启动时加载到执行程序中,可以被多个可执行程序共享使用。使用动态库编译生成的程序相对较小,但运行时需要库文件支持,如果机器里没有这些库文件就不能运行。