Linux 开发工具:编译器:gcc
调试器:gdb
工程管理器:make
脚本语言:shell
gcc特点:(1)可编译多种语言
(2)交叉编译:当前CPU平台上在不同CPU编译(不同CPU不同汇编)
编译器的编译过程:预处理 编译 汇编 链接
预处理:①头文件展开 ②宏替换 ③条件编译(可用于大段注释)
“ ”:搜索路径先在当前目录寻找,然后到系统头文件寻找,否则报错
< > :搜索路径系统头文件
“ ”:用户自定义的头文件 (全用“ ”编译效率低)
< > :系统自带的头文件
gcc -E demo.c > demo.i -E只运行预处理,‘>’重定向:预处理完后输出到demo.i中
编译:gcc -c demo.c 产生 .o 目标文件
语法检查、词法分析
汇编: gcc -S demo.c产生 .s 的汇编文件
链接:链接做哪些工作?
把程序中所有的目标文件和所需的库文件都链接在一起,建立符号表,最终生成一个可执行文件。
#file a.out 可以查看属性
gcc hello.c -o hello (gcc -o hello hello.c)给可执行文件重新命名 ./hello 运行
rm -f demo.* 删除所有有关demo的东西
DSP处理器,做图像处理,浮点型功能比较强
time ./a.out 统计运行时间
三级优化:一级优化:gcc -O1 deme.c
二级优化:gcc -O2 deme.c
三级优化:gcc -O3 deme.c
gcc -w 关闭所有警告 gcc -Wall 打开所有警告
gcc hello.c add.c 编译两个程序
C头文件在 /usr/include中
1、可以在程序中直接写路径,但这样会不可移植
2、gcc main.c add.c -o add -I ../ -I 指定头文件第三方搜索路径
gcc main.c -I ../ -DMAX -D从外部定义一个MAX的宏(-DMAX=100,则相当于在程序中加了:#define MAX 100
)
-static有何作用?
禁止调用动态库,优先使用静态库。
库文件:里面保存函数和变量,可以使用,但看不到变量的定义,函数的实现
静态库: .a后缀 编译时加载
动态库: .so后缀 执行时加载
库的搜索路径: /lib/
/usr/lib
静态库与动态库区别:(1)静态库执行速度快
(2)动态库编译速度快
(3)静态库编译程序可执行文件更大,占用内存多
(4)动态库升级容易
(5)静态库代码易部署
静态库的制作:(1) gcc -c add.c 编译生成后缀为 .o 的目标文件
(2)ar rcs libadd.a add.o lib为前缀,add为库名, .a为后缀
(ar静态库不存在就创建该库文件s更新库文件)
(3)把libadd.a放到默认路径中,即 /lib/ 或 /usr/lib 中
(4)gcc main.c -ladd (-l表示连接一个库)
gcc main.c -ladd -L/root/test -L指定库文件搜索路径
说明文档touch readme
动态库的制作:(1)gcc -shared -fPIC -o libadd.so add.c 生成动态库libadd.so
(2)gcc main.c /root/test/libadd.so -o add 指定动态库路径
libc.a libc.so C语言自带函数库(如printf scanf)
libm.a libm.so 数学库 使用sin函数时,编译时需要连接到数学库中:gcc main.c -lm