C
C语言
bob62856
这个作者很懒,什么都没留下…
展开
-
Makefile中打印变量
一、使用info/warning/error增加调试信息方法1: $(info, “here add the debug info”) 但是此不能打印出.mk的行号方法2: $(warning “here add the debug info”)方法3: $(error “error: this will stop the compile”)这个可以停止当前makefile的编译方法4: $(info $(TARGET_DEVICE) )打印变量的值二、使用echo增加调试信转载 2021-05-16 17:33:58 · 5131 阅读 · 0 评论 -
gcc build a project
1. 执行aclocal,产生aclocal.m4文件aclocal根据configure.ac文件的内容,自动生成aclocal.m4文件。而aclocal.m4文件中,包含了生成configure文件所必须的宏。2. 执行autoconf,生成configure文件autoconf会根据configure.ac和aclocal.m4文件,生成configure文件。3. 执行automake命令,产生Makefile.inautomake会根据Makefile.am文件产生一些文件,包含最重原创 2020-11-11 11:32:28 · 186 阅读 · 0 评论 -
gcc 提供的原子操作
gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。其声明如下:type __sync_fetch_and_add (type *ptr, type value, ...)type __sync_fetch_and_sub (type *ptr, type value, ...)type __sync_fetch_and_or (type *ptr, type value, ...)type __sync_fetch_and_and (type *转载 2020-11-11 11:14:07 · 150 阅读 · 0 评论 -
gcc -ldl 选项作用
如果你的程序中使用dlopen、dlsym、dlclose、dlerror 显示加载动态库,需要设置链接选项 -ldl加载动态链接库,首先为共享库分配物理内存,然后在进程对应的页表项中建立虚拟页和物理页面之间的映射。你可以认为系统中存在一种引用计数机制, 每当一个进程加载了共享库(在该进程的页表中进行一次映射),引用计数加一;一个进程显式卸载(通过dlclose等)共享库或进程退出时,引用计数减 一,当减少到0时,系统卸载共享库。(1)打开动态链接库:dlopen,函数原型void *dlopen转载 2020-09-22 22:57:48 · 697 阅读 · 0 评论 -
静态链接和动态链接优缺点
一、静态链接静态链接 :不同的程序开发者和部门能够相对独立地开发和测试自己的程序模块,大大促进了程序开发效率。优点:代码装载速度快,执行速度略比动态链接库快;只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题。缺点:浪费内存和磁盘空间、模块更新困难;会给对程序的更新、部署和发布带来很多麻烦。例如:在多进程操作系统情况下,假如每个程序内部除了都保留着printf()函数、scanf()函数、strlen()等公转载 2020-08-22 23:22:35 · 3741 阅读 · 0 评论 -
makefile使用--命令(三)
一、Make的概念Make这个词,英语的意思是"制作"。Make命令直接用了这个意思,就是要做出某个文件。比如,要做出文件a.txt,就可以执行下面的命令。$ make a.txt但是,如果你真的输入这条命令,它并不会起作用。因为Make命令本身并不知道,如何做出a.txt,需要有人告诉它,如何调用其他命令完成这个目标。比如,假设文件 a.txt 依赖于 b.txt 和 c.txt ,是后面两个文件连接(cat命令)的产物。那么,make 需要知道下面的规则。a.txt: b.txt c.txt转载 2020-08-18 14:20:27 · 2595 阅读 · 0 评论 -
gdb命令(三)
gdb基本命令在程序编译时增加-g选项以支持gdb调试,如:$ gcc -g example.c -o example.out通过上述命令对example.c编译之后,使用下列命令进入到gdb调试:$ gdb example.out在gdb调试中,常用的命令有以下几个:$ list 缩略为 l列出程序源码,每次列出10行,按回车重复运行上一命令;$ run 缩略为 r程序开始运行,在r后可以加入程序启动参数,程序运行到断点处暂停;$ continue 缩略为 c程序转载 2020-08-17 23:14:22 · 284 阅读 · 0 评论 -
C语言编译、链接过程探究
编译器基本构成:C语言编译基本流程图解:预编译:处理所有的注释,以空格代替将所有的#define删除,并且展开左右的宏定义处理条件编译指令#if,#ifdef ,#elif,#else , #endif处理#include , 展开被包含的文件保留编译器需要使用的#pragma指令例子: gcc - E file.c -o file.i编译:对预处理文件进行词法分析,语法分析和语义分析语法分析:分析关键字,标识符,立即数等是否合法语法分析:分析表达式是是否遵循语法规则语义转载 2020-08-17 21:23:38 · 151 阅读 · 0 评论 -
gdb工作原理(二)
一、组成架构二、ptrace系统调用ptrace系统调用对原型long ptrace(enum __ptrace_request request, pid_t pid,void *addr, void *data);ptrace系统调用提供了一种方法来让父进程可以观察和控制其他进程对执行,检查和改变其核心映像以及寄存器。ptrace系统调用的主要选项:PTRACE_TRACEME:表示本进程将被其父进程跟踪,交付给这个进程的所有信号(除SIGKILL之外),都将使其停止,父进程将通过wai转载 2020-07-28 10:18:22 · 1285 阅读 · 0 评论 -
gdb工作原理(一)
#include <sys/ptrace.h>long ptrace(enum __ptrace_request request, pid_t pid,void *addr, void *data);说明:ptrace系统调用提供了一种方法来让父进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。 主要用来实现断点调试和系统调用跟踪。(man手册)其实,说到这里,一切原理层面应该都比较明朗了(且先不去管内核中是怎么实现ptrace的)。gdb就是调用这个系统调用,然后通过转载 2020-07-28 00:41:14 · 664 阅读 · 0 评论 -
makefile使用--Wall选项(二)
-Wall:选项可以打印出编译时所有的错误或者警告信息。这个选项很容易被遗忘,编译的时候,没有错误或者警告提示,以为自己的程序很完美,其实,里面有可能隐藏着许多陷阱。变量没有初始化,类型不匹配,或者类型转换错误等警告提示需要重点注意,错误就隐藏在这些代码里面。没有使用的变量也需要注意,去掉无用的代码,让整个程序显得干净一点。下次写Makefile的时候,一定加-Wall编译选项。原文链接: https://blog.csdn.net/shenhuan1104/article/details/7686102转载 2020-06-20 01:36:51 · 1410 阅读 · 0 评论 -
makefile使用--wildcard、patsubst、all、.PYONY(一)
src = $(wildcard *.c)obj = $(patsubst %.c, %.o, $(src))all: server clientserver: server.o wrap.o gcc server.o wrap.o -o server -Wallclient: client.o wrap.o gcc client.o wrap.o -o client -Wall%.o:%.c gcc -c $< -Wall.PHO转载 2020-06-20 01:26:58 · 542 阅读 · 0 评论 -
C中strcpy函数实现
strcpy函数实现strcpy函数的原型为:char* strcpy(char* _Dest, const char* _Source);//实现1char * strcpy(char* _Dest, const char* _Source){ //检查传入参数的有效性 assert(NULL != _Dest); assert(NULL != _Source); if (NULL ==_Dest || NULL == _Source) retur转载 2020-09-29 09:52:51 · 998 阅读 · 0 评论 -
new和malloc的区别
属性new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。参数使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。返回类型new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。分配失败.转载 2020-09-26 11:16:19 · 143 阅读 · 0 评论 -
C 引用和指针的区别
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。指针和引用的定义和性质区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:int a=1;int *p=&a;int a=1;int &b=a;上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。而下面2句定义了一个整形转载 2020-09-23 10:56:40 · 1079 阅读 · 0 评论 -
C 格式化字符串
格式字符串的形式为: % [输出最小宽度] [.精度] [长度] 类型例如,%d格式符表示 用十进制整形格式输出。%f表示用实型格式输出,%5.2f 格式表示输出宽度为5(包括小数点),并包含2位小数。函数概要:printf 函数用于打印格式化字符串到标准输出流。函数原型:#include <stdio.h>...int printf ( const char * format, ... );参数解析:format 参数format 参数是一个格式化字符串,由格式化占位转载 2020-08-08 20:17:38 · 2813 阅读 · 0 评论