首页 > 代码库 > gcc gdb makefile学习笔记

gcc gdb makefile学习笔记

一、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