Linux——Ubuntu环境C编程

配置vim编辑器

设置一个tab键为4个空格

打开/etc/vim/vimrc文件,此文件为只读,所以要用sudo访问boot权限:

set ts=4(设置一个tab键为4空格)

set nu(vim编辑器下显示行号) 

 gcc编译器

gcc命令

gcc -c main.c(只编译不链接为可执行文件,将main.c文件编译为.o的目标文件)

gcc main.c -o main(-o表示将main.c编译为可执行文件main,如果不加-o,默认编译为a.out的可执行文件)

 

gcc的编译流程:预处理、编译、汇编和链接。预处理就是对程序中的宏定义等相关的内容先进行前期的处理。编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。汇编就是将汇编语言文件编译成二进制目标文件。链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件。

make工具和Makefile文件

当源码文件比较多的时候就不适合通过直接输入gcc命令来编译,这时候就需要一个自动化的编译工具。

make:一般说GNU Make,是一个软件,用于将源代码文件编译为可执行的二进制文件,make工具主要用于完成自动化编译,make工具编译的时候需要makefile文件提供编译文件。

Makefile:make工具所使用的文件,Makefile指明了编译规则。

Makefile规则格式

Makefile里面是由一系列的规则组成,这些规则格式如下:

下面的规则的目标是main,main.o、input.o和calcu.o是生成main的依赖文件,如果要更新目标main,就必须要先更新它的所有依赖文件,如果依赖文件中的如何一个有更新,那么目标文件也必须更新,“更新”就是执行一遍格则中的命令列表。

命令列表中的每条命令必须以TAB键开始,不能使用空格!!!

make只编译修改过的文件,当我们修改了input.c时再次使用make进行编译时,如下:

删除编译后产生的.o文件和可执行文件main,使用命令make clean:

 

 make的执行过程:

1、make命令会在当前目录下查找以Makefile(makefile也可以)命名的文件。

2、当找到Makefile文件以后就会按照Makefile中定义的规则去编译生成最终的目标文件。

3、当发现目标文件不存在,或者目标文件所依赖的文件比目标文件新(也就是最后修改时间比目标文件晚)的话就会执行后面的命令来更新目标。

        这就是make的执行过程,make工具就是在makefile中一层一层的查找依赖关系,一旦写好了Makefile文件,以后只需要一个make命令即可完成整个工程的编译,极大地提高了开发效率。

#Makefile变量的使用

objects = main.o input.o calcu.o

main: $(objects)

        gcc -o main $(objects)

注意:Makefile的注释符号为#,不能用C语言中的“//”或者“/**/”

在上面的示例中我们使用了“=”对变量进行赋值,Makefile变量的赋值符还有其它两个“:=”和“?=”

1、赋值符“=”

使用“=”在给变量赋值的时候,不一定要用已经定义好的值,也可以使用后面定义的值,比如如下代码:

最终输出:

 “=”赋值符就是变量的真实值取决于它所引用的变量的最后一次有效值。

2、赋值符“:=”

输出:

 

赋值符“:=”不会使用后面定义的变量,只能使用前面已经定义好的,这就是“=”和“:=”的区别。

3、赋值符“?=”

 上述代码的意思就是,如果变量curname前面没有被赋值,那么此变量就是“zhangzhongsheng”,如果前面已经赋值过,那么就使用前面赋的值。

输出:

因为curname前面没有被赋值过,所以赋值为zhangzhongsheng

4、追加赋值“+=”

将+=后面的内容追加到变量后面去 

 

Makefile模式规则

        模式规则中,至少在规则的目标定定义中要包涵“%”,否则就是一般规则,目标中的“%” 表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的 文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。 当“%”出现在目标中的时候,目标中“%”所代表的值决定了依赖中的“%”值,使用方 法如下:

自动化变量

所谓自动化变量就是这种变量会把模式中所 定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该 出现在规则的命令中,常用的自动化变量如下:

模式规则和自动化变量使用如下:

 Makefile伪目标

 使用伪目标主要是为了避免 Makefile 中定义的执行命令的目标和工作目录下的实际文件出 现名字冲突,有时候我们需要编写一个规则用来执行一些命令,但是这个规则不是用来创建文 件的,比如在前面的Makefile文件中有如下代码用来完成清理工程的功能:

当我们的目录下存在clean文件,我们可以使用伪目标来进行区分:

 Shell脚本

shell仅支持整形,数值计算使用$((表达式))

read表示读入数据,-p后跟提示信息,在输入前进行信息提示。

 test命令

test命令用来查看文件是否存在、权限等信息,可以进行数值、字符、文件三方面的测试。

&&命令和||命令

cmd1&&cmd2 当cmd1执行完毕并正确,那么cmd2开始执行,如果cmd1执行完毕错误,那么cmd2不执行。

cmd1||cmd2 当cmd1执行完毕并正确,那么cmd2不执行,反之cmd2执行。

中括号[ ]判断符

 默认参数

$0~$n 表示shell脚本的参数,包括shell脚本命令本身,shell脚本命名本身为$0

$#:#表示最后一个参数的标号。

$@:表示$1、$2、$3...

执行结果:

条件判断if elif else

if 判断语句; then

        执行语句

elif 判断语句; then

        执行语句

else

        执行语句

fi

 

 case语句

 case $变量 in

        "第一个变量内容")

                程序段

                ;;

        "第二个变量内容")

                程序段

                ;;

esac

 shell脚本函数

函数写法如下:

function fname(){

        //函数代码段

}

执行结果如下:

函数传参:

执行结果:

shell循环

shell脚本也支持循环,比如while do done,表示当条件成立的时候就一直循环,直到条件不成立。

while [条件]  //括号内的状态是判断式

do   //循环开始

        //循环代码段

done

执行结果:

还有另外一种until do done,表示条件不成立的时候循环,条件成立以后就不循环了,写法如下:

until [条件]

do

        //循环代码段

done

for循环,使用for循环可以知道有循环次数,写法

for var con1 con2 con3......

do

        //循环代码段

done

执行结果:

第二个for循环写法:

for((初始值;限制值;执行步长))

do

        //循环代码段

done

执行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java访问华为网管软件iMaster NCE的北向接口

最近做的一个项目,需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE(以下简称NCE)用于管理项目的整个网络,尤其是光网络。业主要求我们访问该软件提供的对外接口,读取一些网络信息,比如…

ABeam 德硕 | 共探AI时代人才新生态,ABeam旗下德硕管理咨询(上海)有限公司荣膺2024杰出雇主!

ABeam News 近日,由HRoot主办的“2024中国人力资本发展大会”在上海市徐汇西岸艺术中心A馆盛大开幕并成功举办。大会以“智能协同 人才与AI的共生”为主题,作为咨询公司的ABeam中国,以优秀的人才管理理念及成果,受邀参会并荣获20…

App Store 截图生成器:轻松制作专业级应用营销图片

在线使用 👉 立即使用截图生成器 简介 App Store 截图生成器是一个专门为 iOS 开发者和营销人员设计的在线工具,可以快速生成符合 App Store 规范的应用预览图片。无论是 iPhone 还是 iPad 应用,都能轻松创建出精美的营销截图。 主要特点…

数据结构之顺序表(C语言)

1 线性表 线性表是n个具有相同特性的数据元素的有限序列,是一种在实际中广泛应用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串等。 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是…

#【YashanDB认证】#YCA的学习过程总结-之崖山数据库初体验

概述 前段时间崖山数据库做推广活动,参加了yca的考试,为啥参加这个数据库厂商的学习呢,因为目前这个数据库最像Oracle,又听公司的前辈说呢,这个公司的前身是华为人出来做的数据库,华为人的精神呢&#xff0…

一些硬件知识【2024/11/3】

MLCC电容的ESR比较小,但是他的缺点是容量通常比较低;电解电容的容量比较大,但是他的ESR比较大;而钽电容介于两者之间,是MLCC找不到合适的容值比较大的时候,找钽电容: LC谐振电路: 五…

2024版红娘金媒10.3婚恋相亲系统源码小程序(亲测)

1. 红娘服务 红娘服务模块是该系统的一大特色。专业红娘会通过分析用户的个人资料和偏好, 为用户提供精准的配对建议和个性化服务。用户可以预约红娘服务,通过红娘的介入,提升配对成功率。 2. 相亲活动 相亲活动模块用于组织和管理线下或线…

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中,自扶正救生艇能够发挥关键的救援和保障作用,确保救援人员和被困人员的生命安全,尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船,救生艇能够迅速恢复正常姿态,确保救援人员不会…

鸿蒙网络编程系列42-仓颉版域名解析示例

1. 域名解析简介 域名解析是网络开发中经常使用的功能之一,特别是对于当前版本的鸿蒙API,使用TCP或者UDP等网络协议通讯时,只能使用确定的IP地址进行绑定或者发送消息,还不支持直接使用域名,所以,通过域名…

6.0、静态路由

路由器最主要的功能就是转发数据包。路由器转发数据包时需要查找路由表(你可以理解为地图),管理员可以直接手动配置路由表,这就是静态路由。 1.什么是路由? 在网络世界中,路由是指数据包在网络中的传输路…

玩转HF/魔搭/魔乐社区(作业)

任务描述时间模型下载使用Hugging Face平台、魔搭社区平台(可选)和魔乐社区平台(可选)下载文档中提到的模型(至少需要下载config.json文件、model.safetensors.index.json文件),请在必要的步骤以…

QT——记事本项目

目录 1.给pushButton按键添加图片 1.1 首先复制存放图片的文件夹,打开Qt回到编辑页面,右键单击pro文件选择在Explorer中显示,将图片文件夹粘贴进去你的代码同目录即可 1.2 创建一个新的文件夹 1.3 点击Add Files,将所有图片添加…

Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)

文章目录 零、写在前面一、水平拆分(sharding/分片)、故障转移(failover)机制介绍水平拆分(Sharding)故障转移机制 二、Redis的水平拆分的机制有关的配置1. 环境准备2. 配置文件配置3. 启动所有Redis实例4. 创建集群5. 测试集群读/写6. 集群管理 三、Red…

OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 VIT 跟踪器由于特殊的模型结构而变得更快且极其轻量级,模型文件大约为 767KB。模型下载链接:https://github.com/opencv/…

yolov8训练及测试(ubuntu18.04、tensorrt、ros)

1 数据集制作 1.1标注数据 Linux/Ubuntu/Mac 至少需要 Python 2.6 (推荐使用 Python 3 或更高版本 及 PyQt5) Ubuntu Linux (Python 3 Qt5) git clone https://gitcode.com/gh_mirrors/la/labelImg.git sudo apt-get install pyqt5-dev-tools cd lab…

海睿思产品体系二次开发能力介绍

海睿思产品体系支持用户通过编写开发代码(含低代码),提供定制化功能,解决数据治理和共享场景的个性化需求。 1、数据集成 应用场景:自定义数据集成能力 开发语言:JAVA 使用效果: 1&#xff…

SpringMVC笔记 一万字

此笔记来自于B站尚硅谷 文章目录 一、SpringMVC 简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式:warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求…

Maven随笔

文章目录 1、什么是MAVEN2、Maven模型3、Maven仓库4、项目集成1_Idea集成Maven设置2_创建Maven项目3_POM配置详解4_maven 坐标详情5_Maven工程类型6_导入Maven项目 5、依赖管理1_依赖配置2_依赖传递3_可选依赖4_排除依赖4_可选依赖和排除依赖的区别5_依赖范围6_继承与聚合7_版本…

看门狗有什么用?

看门狗(WATCH-DOG Timer)全称看门狗定时器 用途:防止程序死机(主要用途) 或 单纯用来计时 直接上代码: 只要程序可以正常运行,看门狗就会清零,如果崩了,看门狗就会复位程序

云原生开源开发者沙龙丨AI 应用工程化专场杭州站邀您参会

云原生开源开发者沙龙 AI 原生应用架构专场,邀您一起交流,探索 AI 原生应用的工程化落地! 活动简介 AI 驱动的应用程序开发、部署和运维,给应用带来了新的生命力和想象空间。但大部分开发者对 AI 应用的编程框架、可观测体系、网…