#LinuxC高级 笔记二

news2024/11/23 0:56:25

makefile

gcc

gdb

makefile

1. 分文件编程

1.1 源文件:.c结尾的文件

包含main函数的.c

包含子函数的.c

1.2 头文件:.h结尾的文件

头文件、宏定义、typedef 、结构体、共用体、枚举、函数声明

include引用时“”和<>的区别:

<>去系统目录查找头文件

“”先从当前目录下查找,如果没有再去系统目录查找头文件。

位置查看:ctrl+鼠标点击stdio.h,退出alt+左或右箭头

系统默认搜索路径:/usr/include

2. 编译工具

gcc

1)预处理

展开头文件,删除注释,替换宏定义,不检查语法错误

gcc -E xx.c -io xx.i

  1. 编译

检查语法错误,有错就报错,没有问题就转换成汇编语言,生成汇编文件

gcc -S xx.i -o xx.s

3)汇编  将汇编文件转换成不可执行的二进制文件

gcc -c xx.s -o xx.o

4)链接 链接库文件 生成可执行的二进制文件

gcc xx.o -o xx

gcc xx.c --> ./a.out

gcc xx.c -o xx -->./xx

makefile:

gcc xx.o -o xx

gcc -c xx.c -o xx.o

gdb

gcc -g xx.c 生成 a.out

gdb a.out

r: 运行代码

l: 查看文件

b 行号:添加断点

info b:查看断点情况

d num(断点编号):删除断点

p 变量名:查看变量的值

s/n: 单步运行,s会进入子函数顺序执行;单步跳过,n不会进入子函数

c: 执行到下一个断点的位置

help:帮助

q: 退出

步骤:代码写好后,可以先通过gcc -g 进行编译,没有错误后可以通过gdb a.out进行调试

,输入l查看文件内容,通过b设置断点,输入r运行到断点,然后通过n或s可以进行单步调试,q退出

make

make:工程管理器

make工程管理器就是一个“自动编译管理器”这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。

  1. c 2.c 3.c 4.c 5.c

makefile:

gcc xx.o -o xx

gcc -c xx.c -o xx.o

3. 格式

目标:依赖

<Tab>命令

依赖(面粉)--->命令(加工)--->目标(馒头)

gcc xx.o -o xx 目标:xx 依赖:xx.o

gcc -c xx.c -o xx.o 目标:xx.o 依赖:xx.c

makefile的写法:

.PHONY:clean 避免生成同名文件

aa: 只有目标没有依赖,叫伪目标

运行程序:

make

./test

运行新增的功能:

make aa

也可以运行其他命令:

aa:

touch b.c

4. make管理多个文件

gcc -c main.c -o main.o 目标:main.o 依赖:main.c

gcc -c add.c -o add.o 目标:add.o 依赖:add.c

gcc main.o add.o -o sum 目标:sum 依赖:main.o add.o

5. makefile变量

自定义变量

自己定义的变量:一般用大写表示变量名,取变量的值用 $(变量名)

= 递归方式展开

:= 直接赋值(当前的值是什么就立即赋值)

+= 追加新的值

?= 判断之前是否定义,如果定义了,不重新赋值,否则赋值

预定义变量

RM 文件删除程序的名称,默认值为rm -f

CC C编译器的名称,默认值为cc。

CPP C预编译器的名称,默认值为$(CC) –E。

CFLAGS C编译器的选项,无默认值。

OBJS 生成的二进制文件或目标文件,自己定义

自动变量

$< 第一个依赖的名称

$@ 目标文件的完整名称

$^ 所有不重复的依赖文件,以空格分开

简化版Makefile写法:用 %.c 和 %.o 去替换所有的 .c 和 .o 文件

指针函数

本质是函数,返回值是指针

格式:

数据类型 * 函数名(形参)

{

函数体;

return 地址;//失败返回NULL

}

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

char *fun()

{

//char a[]="hello";//hello在栈区,函数调用结束,空间释放

//char *p="hello"; //hello存放在常量区

char *p=(char *)malloc(100);

strcpy(p,"hello"); //存放在堆区

return p;

}

int main(int argc, char const *argv[])

{

char *p=fun();

printf("%s\n",p);

free(p);

p=NULL;

return 0;

}

函数指针

本质是指针,指向函数

格式:

数据类型 (*指针名)(参数列表)

参数列表:和指向的函数参数列表一致

数据类型:和指向的函数返回值一致

#include<stdio.h>

int add(int a,int b)

{

return a+b;

}

int sub(int a,int b)

{

return a-b;

}

int test(int (*p)(int,int),int a,int b)

{

printf("%d\n",p(a,b));

return 0;

}

int main(int argc, char const *argv[])

{

// int (*p)(int,int);

// p=add;

// printf("%d\n",p(5,2));

// p=sub;

// printf("%d\n",p(5,2));

test(add,5,2);

test(sub,5,2);

return 0;

}

只需要一个test函数,可以实现不同的功能,这个特点叫"多态"

函数指针数组

本质是数组,存放函数指针

格式:

数据类型 (*数组名[元素个数])(参数列表)

int (*arr[2])(int,int)={函数名};

#include<stdio.h>

int add(int a,int b)

{

return a+b;

}

int sub(int a,int b)

{

return a-b;

}

int main(int argc, char const *argv[])

{

int (*arr[2])(int,int)={add,sub};

// arr[0]=add;arr[1]=sub;

for(int i=0;i<2;i++)

printf("%d \n",arr[i](5,3));

return 0;

}

  1. 封装函数实现求一个int类型数据的二进制有几位1

a) 一个整型数 //int a;

b) 一个指向整型的指针 //int *p=&a;

c)一个指向指针的指针,它指向的指针是一个指向一个整型数//int **q=&p;

d)一个有10个整型数的数组 //int a[10]

e)一个有10个指针的数组,该指针是指向一个整型数的 //int *a[10];

f)一个指向有10个整型数数组的指针//int (*p)[10]

g)一个指向函数的指针, 该函数有一个整型参数并返回一个整型数//int (*p)(int);

h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

//int (*arr[10])(int)

条件编译

根据宏是否定义

#define 宏名

#ifdef 宏名

/*code1*/

#else

/*code2*/

#endif

执行顺序:判断宏名是否定义,如果定义就编译code1,否则编译code2

根据宏值

#define 宏名 值

#if 宏名

/*code1*/

#else

/*code2*/

#endif

执行顺序:判断宏的值是否为0,如果不为0编译code1,否则编译code2

防止头文件重复编译

放在头文件中:

#ifndef 宏名

#define 宏名

/*code*/

#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1891670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

泰安再见,泰山OFFICE还会再见

路过泰安&#xff0c;遇见彩虹。怀念和感恩在泰山信息科技的万丈豪情。 泰山OFFICE&#xff0c;还是要复活。

苹果电脑虚拟机运行Windows Mac环境安装Win PD19虚拟机 parallels desktop19虚拟机安装教程免费密钥激活

在如今多元的数字时代&#xff0c;我们经常需要在不同的操作系统环境下进行工作和学习。而对于 Mac 用户来说&#xff0c;有时候需要在自己的电脑上安装 Windows 操作系统&#xff0c;以体验更多软件及功能&#xff0c;而在 Mac 安装 Windows 虚拟机是常用的一种操作。下面就来…

Git详细安装和使用教程

文章目录 准备工作-gitee注册认识及安装GitGit配置用户信息本地初始化Git仓库记录每次更新到仓库查看及切换历史版本Git忽略文件和查看文件状态Git分支-查看及切换Git分支-创建分支Git分支-合并及删除分支Git分支-命令补充Git分支-冲突需求: 准备工作-gitee注册 传送门: gite…

Paimon 在汽车之家的业务实践

汽车之家基于Paimon的实践 摘要&#xff1a;本文分享自汽车之家的王刚、范文、李乾⽼师。介绍了汽车之家基于 Paimon 的一些实践&#xff0c;和一些背景。内容主要为以下四部分&#xff1a; 一、背景 二、业务实践 三、paimon 优化实践 四、未来规划 一、背景 在使用Paimon之前…

独立开发者系列(18)——js的window对象

独立开发者&#xff0c;必然要面对JS代码&#xff0c;基本可以认为在脚本语言里面&#xff0c;JS门槛最低&#xff0c;正因为如此&#xff0c;JS也是最受欢迎的开发语言之一。JS的代码运行规律&#xff0c;按照代码模块执行&#xff0c;也就是<script></script> 每…

node版本控制工具nvm,让你不用再重装node来更新版本。

引言 由于项目的nodejs版本不一致&#xff0c;导致需要卸载安装换版本&#xff0c;十分麻烦&#xff0c;使用nvm node版本控制器来快速切换node版本 下载安装 先把你原来的node安装目录删掉 github下载nvm-setup.zip。傻瓜式安装 Releases coreybutler/nvm-windows (gith…

宝塔Linux面板配置环境 + 创建站点

一、安装 &#xff08;1&#xff09;进入宝塔官网 https://www.bt.cn/new/index.html &#xff08;2&#xff09;点击“ 立即免费安装 ”&#xff0c;选择 Centos安装脚本 &#xff08;3&#xff09;进入 ssh 输入以下命令安装宝塔 yum install -y wget && wget -O …

【论文解读】CVPR2024:DUSt3R: Geometric 3D Vision Made Easy

论文“”https://openaccess.thecvf.com/content/CVPR2024/papers/Wang_DUSt3R_Geometric_3D_Vision_Made_Easy_CVPR_2024_paper.pdf 代码&#xff1a;GitHub - naver/dust3r: DUSt3R: Geometric 3D Vision Made Easy DUSt3R是一种旨在简化几何3D视觉任务的新框架。作者着重于…

错误 [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 python ping

报错提示&#xff1a;错误 [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 用python做了一个批量ping脚本&#xff0c;在windows专业版上没问题&#xff0c;但是到了windows服务器就出现这个报错 解决方法&#xff1a;右键 管理员身份运行 这个脚本 …

电子工程与网络技术解析

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 1、MUX&PD是什么意思 2、Hub 和HUB有什么区别 3、Redriver什么意思 4、Switch是什么意思 5、USB 2.0 ETHERNET2什么意思 6、…

Ubuntu18.04新安装--无网络连接、重启黑屏解决教程

一、安装Ubuntu Ubuntu安装需要U盘作为启动盘&#xff0c;在目前教新的电脑中选中GPT作为分区&#xff0c;制作启动盘&#xff0c;其中在安装双系统Ubuntu时&#xff0c;以自定义格式作为存储空间。详细安装过程以以及如何分区请参考下列链接&#xff1a;内含详细安装过程&…

教育场景中的自动化分拣系统!基于大象机器人UltraArm P340机械臂和传送带的实现

引言 今天我们将展示一个高度自动化的模拟场景&#xff0c;展示多个机械臂与传送带协同工作的高效分拣系统。在这个场景中&#xff0c;机械臂通过视觉识别技术对物体进行分类&#xff0c;并通过精确的机械操作将它们放置在指定的位置。这一系统不仅提高了分拣的速度和准确性&am…

Vue el-table列合并

1.封装公用方法 const dataMethod (data, isH []) > {let spanObj {}; // 存储每个key 对应的合并值let pos {}; // 存储的是 key合并值得索引// 循环数据for (let i 0; i < data.length; i) {let dataI data[i];// 循环数据内对象&#xff0c;查看有多少keyfor (…

使用U盘重装系统

目录 一、 制作启动盘 1. 准备一个U盘和一台电脑 2. 下载win10安装包 二、安装操作系统 1. 插入系统安装盘 2. 通过进入BIOS界面进入到我们自己制作的启动盘上 三、安装成功后进行常规设置 一、 制作启动盘 1. 准备一个U盘和一台电脑 注意&#xff1a;提前备份好U盘内的…

九浅一深Jemalloc5.3.0 -- ⑧浅*free

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但最新版本5.3.0却少之又少。而且5.3.0的架构与5之前的版本有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析最新release版本Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是…

PyTorch环境配置及安装

PyTorch环境配置及安装 Step1&#xff1a;安装Anaconda 参考该链接&#xff08;视频01:30--03:00为安装教程&#xff09;&#xff1a; 【PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】】 https://www.bilibili.com/video/BV1hE41…

04通俗理解自注意力机制(self-attention)

04浅谈自注意力机制&#xff08;self-attention&#xff09; 1. 基本概念 注意力机制 是Transformer模型的核心。它的作用是让模型能够“关注”输入数据的不同部分&#xff0c;而不是一次只处理一个词。比如&#xff0c;当模型在处理一句话时&#xff0c;它可以同时考虑句子中…

AntV学习笔记

文章目录 G6 图可视化引擎简单上手复杂一点的案例 S2 多维交叉分析表格简单的一个vue3使用S2的例子 G6 图可视化引擎 G6 是一个简单、易用、完备的图可视化引擎&#xff0c;它在高定制能力的基础上&#xff0c;提供了一系列设计优雅、便于使用的图可视化解决方案。能帮助开发者…

【数据集】最近开源的一些多模态图表理解数据集

1. CharXiv 现有数据集通常关注过于简化和同质化的图表&#xff0c;并且问题往往基于模板生成&#xff0c;这导致了对MLLMs图表理解能力的过度乐观评估。为了解决这个问题&#xff0c;作者提出了一个新的评估套件CharXiv&#xff0c;它包含了从arXiv论文中精选的2323个自然、具…

昇思25天学习打卡营第10天|linchenfengxue

基于MobileNetv2的垃圾分类 通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 MobileNetv2模型原理介绍 MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#x…