一、gcc (GNU C compiler )
1.预处理 gcc -E aaa.c -o aaa.i → .i(c代码)
↓
2. 编译 gcc -S aaa.i -o aaa.s → .s(汇编代码)
↓
3. 汇编 gcc -c aaa.s -o aaa.o → .o(目标代码—二进制)
↓
4. 链接 gcc aaa.o -o aaa → aaa(可执行文件)
优化编译链接 gcc -O(O2/O3) aaa.o
指定搜索目录
1 .头文件(默认是/usr/include) gcc -I/home -c c1.c
2. 库文件(默认是/usr/lib) gcc -L/home -c c1.c
3.按名字查找库文件 gcc -lpthread -lcurses -c c1.c
静态库(.a)
静态链接 gcc -static hello.c -o hello
gcc -c ku.c
ar -r ku.a ku.o
gcc -c main.c
gcc main.o -L. ku.a -o main
./main
rm ku.a
动态库(.so)
动态链接 gcc hello.c -o hello
gcc -c ku.c
gcc -shared ku.o ku.so
gcc -c main.c
gcc main.o -L. ku.so -o main
./main
//执行出错,找不到该库文件,则:
a.cp ku.so /usr/lib 动态库复制到/usr/lib
b.修改环境变量 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/lizhanglin/windows/csource/
二、gdb(GNU Debugger)
unix下的强大程序调试工具
1.启动程序
2.设置断点停住
3.停止时可以检查程序中的变量
4.动态改变程序运行的环境
gcc -g aaa.c -o aaa 产生调试信息
常用命令:
l:输出代码并显示行号
r:直接运行处结果
break 行号 :设置断点(程序运行到断点停止)
p 变量名 :查看变量的值
c:程序继续运行
clear :删除断点
n:单步调试(不进入函数)
s:单步调试(进入函数)
info break 查看断点信息
delete 断点编号 删除断点
q 退出调试程序
三、makefile
makefile文件是定义编译工程中所有源文件的规则文件
makefile文件结构
目标:依赖
命令(命令前面必须是tab)
mkmain:mkmain.o mk1.o mk2.o
gcc mkmain.o mk1.o mk2.o -o mkmain
mkmain.o:mkmain.c mk1.h mk2.h
gcc -c mkmain.c
mk1.o:mk1.c
gcc -c mk1.c
mk2.o:mk2.c
gcc -c mk2.c
make命令 自动找目录下的makefile文件编译
make -f 其它文件名
makefile文件使用的特殊的符号
$^:代表所有的依赖项
$@:代表目标
$<:代表第一个依赖项
mkmain:mkmain.o mk1.o mk2.o
gcc $^ -o $@
mkmain.o:mkmain.c mk1.h mk2.h
gcc -c $<
mk1.o:mk1.c
gcc -c $<
mk2.o:mk2.c
gcc -c $<
伪目标
针对只有执行动作命令没有依赖项的目标为伪目标
make 伪目标
mkmain:mkmain.o mk1.o mk2.o
gcc $^ -o $@
mkmain.o:mkmain.c mk1.h mk2.h
gcc -c $<
mk1.o:mk1.c
gcc -c $<
mk2.o:mk2.c
gcc -c $<
clear:
rm mk1.o mk2.o mkmain.o
cc为gcc 别名
mkmain:mkmain.o mk1.o mk2.o
cc $^ -o $@
mkmain.o:mkmain.c mk1.h mk2.h
cc -c $<
mk1.o:mk1.c
cc -c $<
mk2.o:mk2.c
cc -c $<
clear:
rm mk1.o mk2.o mkmain.o
makefile使用变量
变量名=值 //声明变量
$(变量名) //获取变量名值
obj=mkmain.o mk1.o mk2.o
ab=gcc
mkmain:$(obj)
$(ab) $(obj) -o mkmain
mkmain.o:mkmain.c mk1.h mk2.h
$(ab) -c mkmain.c
mk1.o:mk1.c
$(ab) -c mk1.c
mk2.o:mk2.c
$(ab) -c mk2.c
取消执行的命令回显到屏幕
obj=mkmain.o mk1.o mk2.o
ab=gcc
mkmain:$(obj)
@$(ab) $(obj) -o mkmain
mkmain.o:mkmain.c mk1.h mk2.h
@$(ab) -c mkmain.c
mk1.o:mk1.c
@$(ab) -c mk1.c
mk2.o:mk2.c
@$(ab) -c mk2.c