makefile和gdb学习
大家一起来学C语言喽
修诡道的马前卒
世事洞穿而寡言,名利看淡而重学!
个人邮箱:yanzhang.guo@qq.com
展开
-
同时使用动态库和静态库时怎么写makefile
项目经验。关键语句: $(CC) -L $(LIB_FOR_SRS) -o $(OUTPUT_DIR)/$(TARGET) $(OBJS) -Wl,-Bstatic -lssl -lcrypto \ -Wl,-Bdynamic $(DYNAMIC_LINK_OPTION) $(STATIC_LINK_OPTION)也可以换成(链接): $(LD) -L $(LIB_FOR_SRS) -o $(OUTPUT_DIR)/$(TARGET) $(OBJS) -Wl...原创 2021-01-19 10:33:02 · 839 阅读 · 0 评论 -
makefile学习0:Makefile 编译生成多个可执行文件
all:server clientserver:server.cgcc $< -o $@client:client.cgcc $< -o $@clean: rm -f server rm -f client解释:$@ ——目标文件的名称;(2) $^ ——所有的依赖文件,以空格分开,不包含重复的依赖文件;(3) $< ——第一...原创 2018-11-07 09:58:07 · 3491 阅读 · 1 评论 -
gdb和gdbserver工具的使用简介与交叉编译
一,介绍 嵌入式系统资源有限性,一般不能直目标系统上进行调试,所以很多情况下都是远程调试,就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作: a,用ROM Monitor调试目标机程序; b,用KGDB调试系统内核; c,用gdbserver调试用户空间程序。 这三种调试方法的区别主要在于,目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。而我们最常用的是调试应用程序,就...原创 2020-05-12 19:00:44 · 1095 阅读 · 0 评论 -
makefile学习14:进阶部分
makefile基础学习前13小节就差不多了,如果想提升自己的makefile,可参考内核源码的makefile,结合下面的内容一起钻研学习。源码下载:https://www.kernel.org/即然make可以指定所有makefile中的目标,那么也包括“伪目标”,于是我们可以根据这种性质来让我们的makefile根据指定的不同的目标来完成不同的事。在Unix世界中,软件发布时,特别是...转载 2019-04-02 02:33:13 · 407 阅读 · 0 评论 -
makefile学习13:判断语句
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。一、示例下面的例子,判断$(CC)变量是否“gcc”,如果是的话,则使用GNU函数编译目标。libs_for_gcc = -lgnunormal_libs =foo: $(objects)ifeq ($(CC),gcc)$(CC) -o foo ...转载 2019-04-02 02:26:26 · 428 阅读 · 0 评论 -
makefile学习12:详细讲解变量
在 Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同的是,你可以在Makefile中改变其值。在Makefile中,变量可以使用在“目标”,“依赖目标”,“命令”或是 Makefile的其它部分中。变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“...转载 2019-04-02 02:23:54 · 475 阅读 · 0 评论 -
makefile学习11:自动生成依赖性
在Makefile中,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main.c中有一句“#include "defs.h"”,那么我们的依赖关系应该是:main.o : main.c defs.h但是,如果是一个比较大型的工程,你必需清楚哪些C文件包含了哪些头文件,并且,你在加入或删除头文件时,也需要小心地修改Makefile,这是一个很没有维护性的工作。为了避免这种繁重而...转载 2019-04-02 02:20:55 · 467 阅读 · 0 评论 -
makefile学习10:多个目标
Makefile 的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件,并且其生成的命令大体类似。于是我们就能把其合并起来。当然,多个目标的生成规则的执行命令是同一个,这可能会可我们带来麻烦,不过好在我们的可以使用一个自动化变量“$@”(关于自动化变量,将在后面讲述),这个变量表示着目前规则中所有的目标的集合,这样说可能很抽象,还是看一个例子吧。bigoutput ...转载 2019-04-02 02:14:47 · 833 阅读 · 0 评论 -
makefile学习9:伪目标
最早先的一个例子中,我们提到过一个“clean”的目标,这是一个“伪目标”:clean:rm *.o temp正像我们前面例子中的“clean”一样,即然我们生成了许多文件编译文件,我们也应该提供一个清除它们的“目标”以备完整地重编译而用。(以“make clean”来使用该目标)因为,我们并不生成“clean”这个文件。“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,...转载 2019-04-02 02:12:44 · 505 阅读 · 0 评论 -
makefile学习8:总结makefile的工作方式
进过前7小节的学习,对makefile的也有些许了解了,下面了解一下它的工作方式。GNU的make工作时的执行步骤入下:(想来其它的make也是类似)1、读入所有的Makefile。2、读入被include的其它Makefile。3、初始化文件中的变量。4、推导隐晦规则,并分析所有规则。5、为所有的目标文件创建依赖关系链。6、根据依赖关系,决定哪些目标要重新生成。7...转载 2019-04-02 02:05:09 · 421 阅读 · 0 评论 -
makefile学习7:echo的使用
类似于shell的echo的语句,echo可以在make执行时打印出自己预设的内容。这个是内核源码根目录的makefile内容,>&2这个是将错误输出到文件描述为2的文件,其实是标准错误。例子:gyz@debian:~/mc$ cat Makefile obj=test.o printarr.otest:$(obj) gcc -o test $(obj)$...原创 2019-04-02 02:00:02 · 20166 阅读 · 0 评论 -
makefile学习6:多个makefile的使用
编译过kernel的人都知道,在内核源代码下有很多makefile,编译的时候是一起用的。如下:可以看到其他makefile就像头文件一样,被包含进来,可以分条include进来,也可以一条include a.mk b.mk c.mk。。。这里多了一个-,表示读取个别文件失败,也继续执行。参考:http://www.cnblogs.com/liangxiaxu/archi...原创 2019-04-02 01:47:35 · 625 阅读 · 0 评论 -
makefile学习5:清除目标文件,注释
前面说过,.PHONY的意思是说clean是个伪命令。.PHONY:cleanclean: rm test $(obj)优化上面的代码:.PHONY:cleanclean: -rm test $(obj)就是在rm前添加一个-,它的意思是后面的文件有错也不予理睬,继续做后面的事。习惯上,大家都把clean写在makefile的后面。makefile里面使...原创 2019-04-01 20:10:13 · 916 阅读 · 0 评论 -
makefile学习4:再优化makefile
makefile有强大的自动推导功能,可以将用到相同.h文件的.o文件写到一起,再优化一下makefile。原来的makefile:gyz@debian:~/mc$ cat Makefile obj=test.o printarr.otest:$(obj) gcc -o test $(obj)test.o:std.hprintarr.o:std.h.PHONY:clean...原创 2019-04-01 16:47:07 · 480 阅读 · 0 评论 -
makefile学习3:隐晦规则,自动推导
makefile可根据.o文件来推导出编译需要(依赖)的.c文件。原来的makefile:gyz@debian:~/mc$ cat Makefile test:test.o printarr.o gcc -o test test.o printarr.otest.o:test.c std.h gcc -c test.c printarr.o:printarr.c std.h ...原创 2019-04-01 16:39:37 · 628 阅读 · 0 评论 -
makefile学习2:使用变量
源代码1:gyz@debian:~/mc$ cat test.c #include "std.h"int main(int argv,char **argc){ int arr[10] = {1,2,3,4,5,6,7,8,9,10}; PrintArray(10,arr); return 0;}源代码2:gyz@debian:~/mc$ cat print...原创 2019-04-01 16:29:18 · 399 阅读 · 0 评论 -
makefile学习1:初识makefile
大材小用一下,下面给一个源文件写makefile,认识一下makefile的依赖性。源代码:#include "std.h"int main(int argv,char **argc){ int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int i = 0; for(;i < 10;i++) { printf("%d\n",arr[i])...原创 2019-04-01 16:07:57 · 425 阅读 · 0 评论 -
gdb学习20:总结
经过20个小部分的学习,对gdb有了一定的了解,真心觉得gdb是一个非常好的调试工具。以后在使用中,有其他的需求,就可以搜索查找,不再是摸着石头过河了。如果有一台大屏幕的电脑,或者两台电脑,一个窗口用于看代码,一个用于调试,那就再好不过了。gdb的中文翻译(https://wenku.baidu.com/view/abf448573c1ec5da50e270fa.html),但是有些地...原创 2019-04-01 00:06:54 · 537 阅读 · 0 评论 -
gdb学习19:打印全局变量和局部变量,动态数组和静态数组
c语言是全局变量和函数局部变量重名时,局部变量覆盖全局变量,所以进入到函数中查看全局变量的值,就不能直接用print了。下面例子,打印出10的就是全局变量,(gdb) p n$1 = 1000(gdb) p 'mystrcopy.c'::n$2 = 10(gdb) p PrintNumbers::n$3 = 1000(gdb) p 'PrintNumbers'::n$4 =...原创 2019-04-01 00:06:47 · 2739 阅读 · 0 评论 -
gdb学习18:查看某个函数的汇编代码
代码:void PrintNumbers(int n){ while(n--) { printf("number is :%d\n",n); }}gdb调试信息:(gdb) disassemble PrintNumbersDump of assembler code for function PrintNumbers: 0x0000555555554795 ...原创 2019-04-01 00:06:40 · 2364 阅读 · 1 评论 -
gdb学习17:动态修改变量的值和打印变量的值
使用print,如下,我修改了n的值,修改为10,所以只打印了10行。如下:33 PrintNumbers(1000);(gdb) sPrintNumbers (n=1000) at mystrcopy.c:1919 while(n--)(gdb) print n=10$1 = 10(gdb) cContinuing.number is :9number is :8...原创 2019-04-01 00:06:20 · 1344 阅读 · 0 评论 -
gdb学习16:使用jump进行跳转
我这里是跳转到11行,跳转过去会执行,执行报错,所以终止了(例1)。也可以跳转到函数(例2)。例1:(gdb) b 31Breakpoint 1 at 0x870: file mystrcopy.c, line 31.(gdb) rStarting program: /home/gyz/mc/mystrcopy copying string!Breakpoint 1, ma...原创 2019-04-01 00:06:03 · 2391 阅读 · 0 评论 -
gdb学习15:退出函数,finish和return的区别
同样的操作,finish的结果:(gdb) info bNum Type Disp Enb Address What1 breakpoint keep y 0x000055555555488f in main at mystrcopy.c:33 breakpoint already hit 1 time2...原创 2019-03-31 18:58:21 · 4145 阅读 · 0 评论 -
gdb学习14:清除停止点
彻底清除停止点:(gdb) info breakNum Type Disp Enb Address What1 breakpoint keep y 0x00005555555548dc in main at strcopy.c:46 stop only if i=10 breakpoint already...原创 2019-03-31 13:29:24 · 611 阅读 · 0 评论 -
gdb学习13:设置观察点
观察点(watchpoint)和断点(breakpoint)类似,但是断点是程序运行前设置,观察点是运行中设置,而且只能是变量。watch 观察到变量变化时,停止程序;rwatch 观察到变量被读时,停止程序;awatch 观察到变量被读或者被写时,停止程序。越来越发现gdb非常强大了。(gdb) rStarting program: /home/gyz/mc/strco...原创 2019-03-31 13:13:52 · 2291 阅读 · 0 评论 -
gdb学习12:设置断点的方法进一步学习
在源代码37行处设置断点(gdb) break 37Breakpoint 1 at 0x829: file strcopy.c, line 37.在源代码34行处设置断点(gdb) break 34Breakpoint 2 at 0x810: file strcopy.c, line 34.在strcopy.c文件的第10行设置断点(gdb) break strcopy.c:10...原创 2019-03-31 12:58:25 · 463 阅读 · 0 评论 -
gdb学习11:启动时添加选项
具体需要添加什么选项,请看旁边解释。gyz@debian:~/mc$ gdb --helpThis is the GNU debugger. Usage: gdb [options] [executable-file [core-file or process-id]] gdb [options] --args executable-file [inferior-ar...原创 2019-03-31 02:17:38 · 709 阅读 · 0 评论 -
gdb学习10:可以使用shell的部分命令
可以使用cd命令进行目录跳转;pwd查看当前路径;ls不能用,不过可以使用file命令,然后tab两下就可以补全了。(gdb) cd .Working directory /home/gyz/mc.(gdb) lsUndefined command: "ls". Try "help".(gdb) file a.out strcopy strcopy.c ...原创 2019-03-31 01:59:00 · 658 阅读 · 0 评论 -
gdb学习9:将调试程序挂载到已经开始的进程
如下,是个小测试:1,gdb开始调试一个程序;2,ps all查看要挂载的程序的pid;3,用attach pid去挂载;4,至于这个卸载命令detach应该是有点问题。参考:https://blog.csdn.net/dadalan/article/details/3758025...原创 2019-03-31 01:53:23 · 2183 阅读 · 0 评论 -
gdb学习8:设置程序运行时的参数
用到两个命令:set和show。set命令,tab键两下,如下:(gdb) set Display all 131 possibilities? (y or n)ada may-insert-breakpointsagent may-insert-fast-tracepo...原创 2019-03-31 01:28:37 · 729 阅读 · 0 评论 -
gdb学习7:自动补全命令和函数名
之前的学习,都是用某个命令的简写,比如break用b,run用r等等,入门阶段,如果跟着别人用简写不知道是什么意思,记忆起来不会那么好。在linux的终端上,我们经常用两次tab键补全命令或者文件名,在gdb调试工具里也是,如下:(gdb) llayout list load (gdb) bbacktrace bookmark break ...原创 2019-03-31 01:15:43 · 1116 阅读 · 0 评论 -
gdb学习6:给函数名设置断点
gdb真的是调试代码的神器,不但可以给代码行设置断点,也可以给函数名设置断点。代码:#include <stdio.h>#include <stdlib.h>#include <string.h>char *MyStrCopy1(const char *s1){ if(NULL == s1) { return "string is N...原创 2019-03-31 01:03:59 · 3039 阅读 · 0 评论 -
gdb学习5:打印函数堆栈和退出函数
代码:#include <stdio.h>#include <stdlib.h>#include <string.h>char *MyStrCopy1(const char *s1){ if(NULL == s1) { return "string is NULL"; } else { char *s2 = (char *)...原创 2019-03-30 21:39:38 · 1011 阅读 · 0 评论 -
gdb学习4:进入函数和打印变量信息
代码:#include <stdio.h>#include <stdlib.h>#include <string.h>char *MyStrCopy1(const char *s1){ if(NULL == s1) { return "string is NULL"; } else { char *s2 = (char *)...原创 2019-03-30 21:27:41 · 2095 阅读 · 0 评论 -
gdb学习3:用gdb的图形界面打开文件
相比前两种方式,我觉得gdb的图形界面做的不好。代码:#include <stdio.h>#include <stdlib.h>#include <string.h>char *MyStrCopy(const char *s1){ if(NULL == s1) { return "string is NULL"; } else ...原创 2019-03-29 16:58:14 · 904 阅读 · 0 评论 -
gdb学习2:另一种打开可执行文件的方法
比起上篇博文用file的方法,这篇博文(初识gdb)的方法会更加常用一点。程序:#include <stdio.h>#include <stdlib.h>#include <string.h>char *MyStrCopy(const char *s1){ if(NULL == s1) { return "string is NULL...原创 2019-03-29 16:33:27 · 639 阅读 · 0 评论 -
gdb学习1:初识gdb
(为了看起来比较舒服,罗里吧嗦的东西,我就不往上面粘贴了,以后都是这样,不再解释)gdb是linux上的调试工具,功能非常强大,我这里是debian9.8,默认是没有安装gdb的,所以要先安装:gyz@debian:~/mc$ sudo apt-get install gdb先写个程序:#include <stdio.h>#include <stdli...原创 2019-03-29 16:27:04 · 597 阅读 · 0 评论 -
gdb学习0:gdb的gui调试窗口与gdb命令行的切换
有错的地方,或者不同意见的,烦请留言,或者发邮箱。邮箱地址:1746902011@qq.com—————————————————————————————————当我们使用gdb的gui窗口是发现,上下键(up&&down键)只能移动代码,不能移动下面的命令,下面我们说明如何可以移动下面命令。首先我们进入gdb的gui调试窗口:[gyz@archlinux jo...原创 2018-12-29 16:43:37 · 4893 阅读 · 0 评论