Unix操作系统
美国AT&T公司贝尔实验室,1971年,肯.汤普逊、丹尼斯.里奇。
PDP-11,多用户、多任务、支持多种处理器架构,高安全性、高可靠性,高稳定性。
既可构建大型关键业务系统的商业服务器应用,也可构建面向移动终端、手持设备等的嵌入式应用。
Linux操作系统
类Unix操作系统,免费开源,不同发行版本使用相同内核。
手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型计算机、超级计算机。
严格意义上的Linux仅指操作系统内核,隶属于GNU工程,发明人Linus Torvalds。
构建(Build)过程
编辑 -> 预编译 -> 编译 -> 汇编 -> 链接
1) 编辑: vi hello.c -> hello.c
2) 预编译:gcc -E hello.c -o hello.i -> hello.i -+
3) 编译: gcc -S hello.i -> hello.s | GCC
4) 汇编: gcc -c hello.s -> hello.o | 工具链
5) 链接: gcc hello.o -o hello -> hello -+
文件后缀
1..h - C语言源代码头文件
2..c - 预处理前的C语言源代码文件
3..i - 预处理后的C语言源代码文件
4..s - 汇编语言文件
5..o - 目标文件
6..a - 静态库文件
7..so - 共享库(动态库)文件
编译单个源程序
gcc [选项参数] 文件
2.-c - 只编译不链接
3.-o - 指定输出文件
4.-E - 预编译
5.-S - 产生汇编文件
6.-pedantic - 对不符合ANSI/ISO C语言标准的
7. 扩展语法产生警告
8.-Wall - 产生尽可能多的警告。
9. 范例:gcc -Wall wall.c
10.-Werror - 将警告作为错误处理。
11. 范例:gcc -Werror werror.c
12.-x - 指定源代码的语言。
13. 范例:gcc -x c++ cpp.c -lstdc++
14.-g - 生成调试信息
15.-O1/O2/O3 - 优化等级
编译多个源程序
gcc [选项参数] 文件1 文件2 …
•头文件的作用是什么
1) 声明外部变量、函数和类。
2) 定义宏、类型别名和自定义类型。
3) 包含其它头文件。
4) 借助头文件卫士,防止因同一个头文件被多次包含,而引发重定义错。
•包含头文件时需要注意的问题
1) gcc的-I选项
指定头文件附加搜索路径。
2) #include <…>
先找-I指定的目录,再找系统目录。
3) #include "…"
先找-I指定的目录,再找当前目录,最后找系统目录。
4) 头文件的系统目录
/usr/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/4.6.3/include
/usr/include/c++/4.6.3 (C++编译器优先查找此目录)
环境变量
1.C_INCLUDE_PATH - C头文件的附加搜索路径,相当于gcc的-I选项
2.CPATH - 同C_INCLUDE_PATH
3.CPLUS_INCLUDE_PATH - C++头文件的附加搜索路径
4.LIBRARY_PATH - 链接时查找静态库/共享库的路径
5.LD_LIBRARY_PATH - 运行时查找共享库的路径
创建静态库
1) 编辑源程序:.c/.h
2) 编译成目标文件:gcc -c xxx.c -> xxx.o
3) 打包成静态库文件:ar -r libxxx.a xxx.o …
ar指令:ar [选项] 静态库文件名 目标文件列表
-r - 将目标文件插入到静态库中,已存在则更新
-q - 将目标文件追加到静态库尾
-d - 从静态库中删除目标文件
-t - 列表显示静态库中的目标文件
-x - 将静态库展开为目标文件
注意:提供静态库的同时也需要提供头文件
创建共享库
1) 编辑源程序:.c/.h
2) 编译成目标文件:gcc -c -fpic xxx.c -> xxx.o
3) 链接成共享库文件:gcc -shared xxx.o … -o libxxx.so
辅助工具
nm: 查看目标文件、可执行文件、静态库、共享库中的符号列表。
ldd: 查看可执行文件和共享库的动态依赖。
ldconfig: 共享库管理。
事先将共享库的路径信息写入/etc/ld.so.conf配置文件中,ldconfig根据该配置文件生成/etc/ld.so.cache缓冲文件,并将该缓冲文件载入内存,借以提高共享库的加载效率。
系统启动时自动执行ldconfig,但若修改了共享库配置,则需要手动执行该程序。
strip: 减肥。去除目标文件、可执行文件、静态库和共享库中的符号列表、调试信息等。
objdump: 显示二进制模块的反汇编信息。