GCC与GDB使用方法

来源:互联网 发布:淘宝买家大尺度照片 编辑:程序博客网 时间:2024/06/05 12:03
gcc编译过程:
hello.c(源文件)--[预处理-E]--hello.i(被修改的源文件)--[编译器-c]--hello.s(汇编程序)--[汇编器]--hello.o(可重定位目标程序)--[链接器]--hello(可执行程序)


【选项】
-o 产生目标文件(.i .o .s)
-c 通知gcc取消连接步骤,即编译源码并生成目标文件
-E 只运行c预编译器
-S 告诉编译器产生汇编语言文件后即停止编译
-Wall 对代码有问题的地方发出警告
-Idir 将dir目录加入搜索头文件的目录路径
-Ldir 将dir目录加入搜索库的目录路径
-llib连接lib库
-g在目标文件中嵌入调试信息,以便gdb之类的调试程序调用


注:【在vi编辑完成后输入crtl+s会导致终端卡死】
解决方法:crtl+q


【执行一个hello.c文件】
1:gcc -E hello.c -o hello.i //预处理
2:gcc -S hello.i -o hello.s //编译
3:gcc -c hello.s -o hello.o //汇编
4:gcc hello.o -o hello //连接
或者直接一步 gcc hello.c -o hello //直接编译连接成可执行目标文件,gcc -Wall hello.c -o hello会提示错误 
gcc -c hello.c或gcc -c hello.c -o hello.o //直接编译成可重定位目标文件(取消连接)


【gcc编译多文件】
gcc -Wall hello.c main.c -o hello
如果只改变了main.c文件只需要将main.c编译成main.o 然后 gcc -Wall hello.o main.o -o main


【使用外部库】-l选项
-lm 表示要链接libm.so(共享库)或者libm.a(静态库)库文件


【静态库.a】:程序在编译链接的时候把库的代码连接到可执行文件中,程序运行的时候将不再需要静态库


【共享库.sa或.so】:程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码


【生成静态库】
ar rcs libhello.a hello.o //ar是gnu归档工具,rcs表示(replace and create)
链接生成:gcc -Wall main.c libhello.a -o main或者gcc -Wall -L. main.o -o main -lhello(-L.表示是当前目录)
l:链接共享库,只要库名去掉lib和版本号
L:链接库所在路径
~/.bash_profile
【生成动态库】


【make】
利用make工具可以自动完成编译工作,这些工作包括:如果只修改了某几个源文件,则只编译这几个源文件。可以大大简化开发工作
【Makefile】make工具通过makefile文件来完成自动维护和编译工作,Makefile文件描述了整个工程的编译连接工作
makefile格式:
目标:依赖
[tab]命令
例如:makefile
.PHONY:clean(显示指定clean为伪目标,以防止该目录下有个clean文件导致无法执行make clean操作)
main:main.o add.o sub.o
gcc -Wall -g main.o add.o sub.o -o main
main.o:main.c
gcc -Wall -g -c main.c -o main.o
add.o:add.c add.h
gcc -Wall -g -c add.c -o add.o
sub.o:sub.c sub.h
gcc -Wall -g -c sub.c -o sub.o
clean(伪目标无依赖列表只是用来执行代码,可以通过make clean命令执行删除):
rm -f main main.o add.o sub.o

注:如果只想编译某一条文件,可以通过make+目标文件名
【Makefile自动化变量】
$@:规则的目标文件名
$<:规则的第一个依赖文件名
$^:规则的所有依赖文件列表
OBJECTS(表示定义变量)
例如:makefile_1
.PHONY:clean
OBJECTS=main.o add.o sub.o
main:$(OBJECTS)
gcc -Wall -g $^ -o $@
main.o:main.c
gcc -Wall -g -c main.c -o main.o
add.o:add.c add.h
gcc -Wall -g -c add.c -o add.o
sub.o:sub.c sub.h
gcc -Wall -g -c sub.c -o sub.o
clean:
echo "hello"(如果不想打印在前加@)
rm -f main main.o add.o sub.o


可以通过make -f makefile_1 执行makefile_1中的命令
【makefile编译多个可执行文件】
【模式生成】:%.o:%.c
例1:
.PHONY:clean all
BIN= test1 test2
all:$(BIN)//自动匹配生成同名可执行文件
%.o:%.c  //也可以是.c.o:
gcc -Wall -g -c $< -o $@
clean:
rm -f $(BIN)


例2:
.PHONY:clean all
CC=gcc
CFLAGES=-Wall -g
BIN= test1 test2
all:$(BIN)
%.o:%.c
$(CC) $(CFLAGES) -c $< -o $@
test1:test1.o
$(CC) $(CFLAGES)  $^ -o $@
test2:test2.o
$(CC) $(CFLAGES)  $^ -o $@
clean:
rm -f *.o $(BIN)


【make常用内嵌函数】
【函数调用】
$(function argument)
【模式匹配】
$(wildcard PATTREN)
例如:src=$(wildcard *.c)
【模式替换函数】
$(patsubst PATTREN,REPLACEMENT,TEXT)
例如:$(patsubst %.c,%.o.$src)或者$(src:.c=.o)
【shell函数】
$(shell 命令)
【多级目录makefile】


例1:bll dal ui三个目录下均有.c文件,合并生成一个可执行文件
CC      = gcc   
CFLAGS  =-Wall -g
BIN     = main  
SUBDIR  = $(shell ls -d */)
ROOTSRC = $(wildcard *.c)
ROOTOBJ = $(ROOTSRC:%.c=%.o)
SUBSRC  = $(shell find $(SUBDIR) -name '*.c')
SUBOBJ  = $(SUBSRC:%.c=%.o)
$(BIN):$(ROOTOBJ) $(SUBOBJ)
        $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
.c.o:
        $(CC) $(CFLAGS) -c $< -o $@
clean:
        rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
例2:
SUBDIRS=test1 test2
.PHONY:default all clean $(SUBDIRS)
default:all
all clean:
$(MAKE) $(SUBDIRS) TARGET=$@
$(SUBDIRS):
$(MAKE) -C $@ $(TARGET)//相当于 make all test1/makefile ,进入文件夹中makefile文件将参数all传递进去


【gdb调试工具】
list 或者l查看源代码
break 10 或者(b 10)在第十行设置断点
info break 或者(i b)查看断点
run r启动
step s 单步跟踪
next n不进入函数
print p 打印变量值
until 跳出循环
continue c 步行到下一个断点
回车表示依然使用上一个命令
finish 退出整个函数
0 0
原创粉丝点击