Makefile和gdb的简单使用

1、为什么要用Makefile进行多个.C文件的编译:

(1).一般我们在进行项目开发的时候,会建立工程,下面有许多目录,不同目录下又有许多.C文件,这事就需要联合编译了。

(2).我们自己手动编译的话,多个程序文件交织在一起,会出现不同文件资源之间的依赖与被依赖关系。那么在编译的时候就会出现问题:必须先解决被依赖项,在解决依赖项

在这种情况下,我们进行手动编译的话,将会变得异常困难,首先我们必须记住依赖关系,才能知道编译顺序,其次每一次都要执行非常多的gcc编译命令才能完成最终的编译目标(gcc中还带有许多参数呢)。

(3). 这时就得用Makefile,Makefile是工程管理的有效工具,用脚本语言进行编写。

2、Makefile的使用规则:

使用命令: make test

./test    (test就是你最终生成的目标文件)

make:只修改你新改动的文件

Makefile中的书写规则:

目标... : [依赖项...]

[[@]命令]

(1).[]中为可写可不写的内容。

(2)[email protected]符号:命令在终端上出现的关闭符号。

(3).命令前必须有一个tab符号。

Makefile中可以定义变量,好处:减少书写规则。

变量的使用格式:${变量名称}。

自动变量:

命令 解释
[email protected] 代表规则里的目标文件
$^ 代表规则里所有依赖文件
$< 代表规则里第一个依赖文件
%.o : %.c 所有的.o文件均一一对应依赖与其后的.c文件(模式规则)

注意:(1).Makefile当中出现.PHONY:clean 意思是,当前目录下也有clean文件时,执行Makefile中的命令clean。

(2).当其中有确定规则时,执行确定规则的命令。

这个是没有使用变量前的Makefile内容。

这个是使用变量后的精简Makefile。

3、头文件的一点知识。

< >和" "的区别:< >,在系统的指定目录下去找,一般情况下在/usr/include/xxx.h

" ", 在当前目录下找

头文件的格式:

#ifndef _TEST_H_

#define _TEST_H_

......

#endif            条件预编译目的:防止头文件的重复包含。

4、gdb的使用

(1).命令:gcc -g test.c -o test   (-g是调试程序必须用的参数)

gdb -q test         (-q跳过提示,直接调试) (test要调试的目标文件)

start    进入调试

s和n: s表示遇到函数,不进入函数,往下继续调试;n表示进入函数,跳转到函数进行调试。

(2).设断点    b  行数

run        :此时将跳转到该行进行。  
        删除断点   d  n(n不是行数,表示将第几个断点删除)

查看断点   info  b

(3).一些输出:

打印/格式  相应的量

p/x str    p/c *str   p/d str ......可以查看相应的地址,值,字符......

离开gdb调试:q

时间: 2024-10-26 22:22:52

Makefile和gdb的简单使用的相关文章

Makefile 加入gdb以及不同目录编译

条件:根目录下两个文件夹fun,head ./fun/function.h ./fun/function.c ./head/define.h ./main.c 以下为对应的文件源码,相对比较简单,仅仅起一个抛砖引玉的作用,到时候只需要照搬就行. function.h #include <stdio.h> #include <stdlib.h> #include "../head/define.h" void show_hello(); function.c #i

makefile、gdb使用记录

makefile的模板 all: rover server station rover: rover.c tcputil.o gcc rover.c tcputil.o -o rover -lpthread server: server.c tcputil.o gcc server.c tcputil.o -o server -lpthread station:station.c tcputil.o gcc station.c tcputil.o -o station -lpthread tcp

AutoConf自动生成Makefile(基于helloworld简单例子)

新建一个简单的helloworld工程文件夹,目录结构如下 hello.h代码: #include<stdio.h> void fprint() { printf("hello world!\n"); } hello.c代码: #include"hello.h" int main() { fprint(); return 0; } 利用AutoConf工具套件来自动生成Makefile 1. 进入helloworld/目录,运行autoscan 生成au

linux下gdb的简单使用

1.首先,编译时要添加gdb信息 gcc -g test.c -o test 2.gdb的一些基本命令 l <-------------------- l命令相当于list,从第一行开始例出原码.回车<-------------------- 直接回车表示,重复上一次命令 r <--------------------- 运行程序,run命令简写 break 16 <-------------------- 设置断点,在源程序第16行处. break func <------

Makefile (2) gdb

gdb调试 1.用debug的方式编译 -g 2.打上断点 3.单步调试 step into 进入函数里面 step over 运行整个函数 step return 跳出当前函数 4.继续运行 5.打印和监控值 下面是栗子: 1 #include <stdlib.h> 2 #include <stdio.h> 3 ? 4 static int add(int i) //创建一个函数,循环10次,将传进来的数每次+1 5 { 6 7 for(int k=0;k<10;k++)

Makefile解析(最简单的LED)

①led_sp.bin: start.o led.o #led_sp.bin是由 start.o 和 led.o 生成 ②arm-linux-ld -Ttext 0x0 -o led_sp.elf $^ 设置led_sp.elf的起始地址0x0 ③arm-linux-objcopy -O binary led_sp.elf led_sp.bin 把led_sp.elf中的内容复制到led_sp.bin中 ④arm-linux-objdump -D led_sp.elf > led_sp_elf.

Makefile &amp;&amp; GDB

昨天学习了C++内存空间一章,看了TCP/IP第一卷第一章,最后看了<Linux网络编程>里的Makefile和gdb部分.现在靠回忆补上一篇博客. 一:C++有三种内存存储模式(C++11有4种,多了“线程存储”) 1.自动变量 a.auto声明变量的方式已被取消,register方式仍然保持 b.自动变量的生存周期就是定义的位置到括号结束的位置 2.静态变量 a.有三种静态变量:链接性为外部,链接性为内部,没有链接性. b.三种对应定义方式为:定义在函数外面:定义在函数外面并加上stati

Linux 内核 Makefile 体系简单分析 (转)

转载自mz_linux的ChinaUnix博客 :http://blog.chinaunix.net/uid-26806098-id-3141136.html 众所周知,Linux内核是使用make命令来配置并编译的,那必然少不了Makefile.在内核目录树中我们可以看到内核编译系统的顶层Makefile文件.但是如此复杂.庞大的内核源码绝不可能使用一个或几个Makefile文件来完成配置编译,而是需要一套同样复杂.庞大,且为Linux内核定制的Makefile系统.她可以说是内核的一个子系统

使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序

在 Linux 上开发 C/C++ 程序,或许你会直接(本机或远端)登入 Linux,打开编辑器写完代码后,就用 gcc/g++ 来编译,遇到要除错(debug)的时候,则会选择使用 gdb 来进行除错.现在,如果你刚好也很喜欢 Visual Studio,你可以不必改变习惯,用 Visual Studio写程式.然后远端送到 Linux 上编译.甚至还能接上 gdb 来除错.这个对于开发像是嵌入式系统.或是 IoT 装置的程序等等就可以多多利用 Visual Studio 强大的 IDE 能力