2. GNU make 项目管理工具
3. 创建和使用函数库
4. GNU C 函数库(glibc)
1.GNU C 编译器
使用 c语言 编写的代码,运行前必须经过编译和链接,最终生成可执行程序。(编译,编译语言源代码;链接,链接引用的函数库。)这个孕育的过程,需要一些工具、一些函数库,其中这个工具就叫做“编译器”。
GNU C 编译器叫做 gcc,gcc包含了预处理器、编译器、汇编器、链接器等。语法格式:
$ gcc [option] dest_file source_file
选 项功 能Wall 打印警告信息
g 添加调试信息到输出文件
O o0 o1 o2 优化选项,多个同时出现时,最后一个生效
I 指定头文件搜索路径,可以出现多个
L 指定库文件搜索路径,可以出现多个
l 指定引用的库
static 使用静态链接
shared 使用动态链接
E 输出预处理后的文件
S 编译生成的汇编文件(.s)
c 编译生成的目标文件(.o)
o 指定输出的文件名(default:a.out)
编译hello world为例:
[linuxidc.com@linuxidc 00]$ gcc -S hello.c // 生成汇编代码 [linuxidc.com@linuxidc 00]$ ls hello.c hello.s [linuxidc.com@linuxidc 00]$ gcc -c hello.c // 生成目标代码 [linuxidc.com@linuxidc 00]$ ls hello.c hello.o [linuxidc.com@linuxidc 00]$ gcc hello.o // 链接目标文件 [linuxidc.com@linuxidc 00]$ ls a.out hello.c hello.o [linuxidc.com@linuxidc 00]$ ./a.out hello world. [linuxidc.com@linuxidc 00]$ gcc -Wall hello.c -o hello // 打开警告信息,指定可执行文件名称 [linuxidc.com@linuxidc 00]$ ls hello hello.c [linuxidc.com@linuxidc 00]$ ./hello hello world.
2.GNU make 项目管理工具
项目中,常采用模块化开发,将系统分解为多个模块,每个模块完成特定的功能。如此分了模块,便会出现多个源代码文件。在调试阶段,可能会反复编译链接,会出现繁琐的重复操作。于是,make 应运而生,来代替手动的繁琐重复操作。make 还可以规避编译未修改源代码的文件。
2.1.格式
make 工具可以从文本文件读取编译规则,每条规则的语法如下:
目标列表:依赖的文件列表 <tab>命令1 # 每行命令的开头必须有一个 tab空白符 <tab>命令2 # 可以存在多条命令
每条规则由:依赖关系和命令两部分组成。所有的命令开头需要有个tab,以#开头表示注释的内容。
make 命令的语法:
$ make [option] [目标] // 创建指定的目标(默认首个目标) $ make -h // 显示所有的make选项
规则文件 Makefile 举例:
hello:hello.o gcc -o hello hello.o hello.o:hello.c gcc -c -o hello.o hello.c clean: rm -f *.o
2.2.变量
变量的定义和引用,跟 Shell 中一样。
CC = gcc INSTALL = install CFLAGS = -O2 -Wall -W -Wshadow OBJS = main.o prelogin.o postlogin.o privsock.o \ tunables.o secbuf.o ls.o .c.o: $(CC) -c $*.c $(CFLAGS) $(IFLAGS) install: if [ -x /usr/local/sbin ]; then \ $(INSTALL) -m 755 fint /usr/local/sbin/fint; \ else \ $(INSTALL) -m 755 fint /usr/sbin/fint; fi
GNU make 预定义了一些变量,在 Makefile 文件中可以直接使用,也可以对这些变量进行重新定义。
预定义变量含义默认值RM 删除文件 rm -r
$^ 规则中出现所有依赖文件
$< 第一个依赖文件的名称
$?
规则中出现所有依赖文件