gdb和makefile

来源:互联网 发布:godaddy怎么解析域名 编辑:程序博客网 时间:2024/05/15 03:47

现在假设文件目录下有

insertsort.cbubblesort.c main.c sort.h

现在生成时打印调试信息

gcc *.c -o app -g

接着开始调试

按l,回车。默认显示包含main的文件

若要指定想调试的文件,这么写:l sort.c:20

 

打断点break 22/b22

条件断点 b22 if i==15

查看断点信息 i b(info breakpoint)

执行程序:start,接着按n执行一行,c(continue)

s进入函数体内部。

查看变量值p+变量名

ptype+变量名,显示变量类型

infodisplay+变量名,追踪变量

u 跳出单次循环

 

 

 

 

 

 

MakeFile

管理代码的工具

gcc也许很长,这时候就需要makefile,makefile通常由架构师编写,不由工程师编写和管理。

makefile是一个文件,记录了编译我们文件的步骤。

vim makefile

规则:目标+依赖条件+命令

格式如下:目标:依赖条件

命令

一个最简单的例子:

app:main.cadd.c sub.c ./mul.c

gcc main.c add.c sub.c mul.c -o app

然后执行make即可

 

我们需要的是.o

所以改写成

app:main.oadd.o sub.o mul.o

gcc main.o add.o sub.o mul.o -o app

main.o:main.c

gcc -c main.c

add.o:add.c

gcc -c add.c

sub.o:msub.c

gcc -c sub.c

mul.o:mul.c

gcc -c mul.c

 

太麻烦了,可以改成这样

obj=main.o add.o sub.o mul.o

target=app

$(target):$(obj)//终极目标,main.o不存在,则向下查找

gcc $(obj) -o $(target)

%.o:%.c

gcc -c  $<  -o  $@

//%.o:%.c的作用:模式匹配,前面提到的终极目标里,main.o找不到,但是这里可以匹配,%匹配main,于是变成main.o:main.c;add.o类似

//$<也就是mian.o $@也就是app

//$^,也就是add.o sub.o mul.o

 

举个例子:下面这个

app:main.osub.o mul.o

gcc main.o sub.o mul.o -o app

可以写成

app:main.osub.o mul.o

gcc $^ -o $@

 

makefile中的自动变量

$<:规则中的第一个依赖

$@:规则中的目标

$^:规则中的所有依赖

只能在规则的命令中使用。

然后再改写下:

 

 

obj=main.o add.o sub.o mul.o

target=app

CC=gcc

CPPFLAGS = -Wall -g-I

$(target):$(obj)

$(CC) $(obj) -o $(target)

%.o:%.c

$(CC) -c  $<  -o  $@

 

写到这里,你的makefile已经让人完全无法看懂了。。。但是最后还要给一个更抽象的版本

现在我们发现.o文件要全部写一遍,太麻烦了,可它又是中间文件,由.c文件生成

所以,我们获取指定的.c,然后根据.c生成.o

src=$(wildcard ./*.c)//函数名wildcard 参数是本目录下的所有.c,然后$符号取其值

obj=$(patsubst./%.c,./%o,$(src) )//这是模式匹配,然后替换.从src取当前目录下所有.c,替换成.o

所以,我们的最新版本makefile是

 

target=app

src=$(wildcard ./*.c)

obj=$(patsubst./%.c,./%.o,$(src))

#target=app

CC=gcc

CPPFLAGS = -I

$(target):$(obj)

        $(CC) $(obj) -o $(target)

%.o:%.c

        $(CC) -c $<  -o $@i

clean:

        rm $(obj) $(target)i

#清除*.o和target,这个规则和终极规则完全无关

clean:

rm  $(obj) $(target)

 

现在我们使用

make

生成.o 和app

再执行make clean ,就清理掉了.o和app,也就是说只执行clean操作

 

我们再加个规则以便理解

hello:

echo "hello,makefile"

你再执行make hello,只执行echo"hello,makefile"

 

src=$(wildcard ./*.c)

obj=$(patsubst./%.c,./%o,$(src) )

target=app

CC=gcc

CPPFLAGS = -I

$(target):$(obj)

$(CC) $(obj) -o $(target)

%.o:%.c

$(CC) -c  $<  -o  $@

 

.PHONY:clean#避免提示clean是最新的

clean:

-rm  $(obj) $(target) -f#-rm:忽略错误继续执行

执行两次make clean会报错,因为文件第一次就被删除了,加上参数-f即可

 

针对文件夹下都是含main的.c文件

 

src = $(wildcard *.c)

targets = $(patsubst%.c, %, $(src))

 

CC = gcc

CFLAGS = -Wall -g

 

all:$(targets)

 

$(targets):%:%.c

        $(CC) $< -o $@ $(CFLAGS)

 

.PHONY:clean all

clean:

        -rm -rf $(targets)

all后是要生成的所有目标文件