Linux系统编程学习笔记
1 前言
1.1 环境
平台:uabntu20.04
工具:vim,gcc,make
1.2 GCC
Linux系统下的GCC(GNU Compiler Collection)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
GCC编译器能将C、C++语言源程序、汇程式化序和目标程序编译、链接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。
GCC编译器编译C源文件为可执行文件的步骤:
C源文件—->预处理.i—->编译.s(生成汇编文件)—->汇编.o/.obj(生成目标文件)—->链接.out(生成可执行文件)—->可执行文件
gcc命令参数(选项)
参数 含义 示例
参数 | 含义 | 示例 |
-c | 对文件进行预处理、编译和汇编,生成obj文件 | gcc -c hello.c |
-S | 只进行预处理和编译,生成汇编代码 | gcc -S hello.c |
-E | 只进行预处理,这个选项不生成文件,可以使用重定向或者-o选项使其生成一个文件 | gcc -E hello.c > hello.i或者gcc -E hello.c -o hello.i |
-o | 指定目标的名称,默认为a.out | gcc -o hello hello.c |
过程演示
例如源代码main.c:
#include<stdio.h>int main(void) {printf("Hello World!\n");return 0;
}
预编译:这个过程处理宏定义和include,去除注释,不会对语法进行检查。可以看到预编译后,源文件的代码从6行扩展了很多行,生成main.i
gcc -E main.c > main.i # 或者 gcc -E main.c -o main.i
// ...
// 只展示了一部分
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 943 "/usr/include/stdio.h" 3 4# 2 "main.c" 2
int main(void) {printf("Hello World!\n");return 0;
}
编译:这个阶段,检查语法,生成汇编代码main.s
gcc -S main.c -o main.s
.file "main.c".section .rodata
.LC0:.string "Hello World!".text.globl main.type main, @function
main:
.LFB0:.cfi_startprocpushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movl $.LC0, %edicall putsmovl $0, %eaxpopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size main, .-main.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)".section .note.GNU-stack,"",@progbits
汇编:这个阶段,生成目标代码main.o
gcc -c main.s -o main.o
链接:生成可执行代码main。
链接分为两种,一种是静态链接,另外一种是动态链接。
使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。
使用动态链接的好处是,生成的程序比较小,占用较少的内存。
gcc main.o -o main
运行
[root@HongyiZeng c]# ./main
Hello World!
1.3 make
make命令是GNU工程化中的一个编译工具。make是依赖于Makefile来编译多个源文件的工具。在Makefile里同样是用gcc(或者别的编译器)来编译程序。
可以使用以下命令直接生成可执行文件:
make main
直接运行
[root@HongyiZeng c]# ./main
Hello World!
1.4 makefile
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
1.4.1 使用gcc的例子
创建文件:
touch main.c tool1.c tool1.h tool2.c tool2.h
可以使用vim * -p打开当前目录下的所有文件。-p是打开多个文件的选项。
在命令模式下,gt切换到下一个标签页,gT切换到上一个标签页。
退出多个标签时,可加上a,例如:qa或者:wqa等
tool1.h和tool1.c
#ifndef __TOOL1_H__
#define __TOOL1_H__void mytool1();
#endif
#include <stdio.h>
#include "tool1.h"
void mytool1() {printf("tool1 print...\n");
}
tool2.h和tool2.c
#ifndef __TOOL2_H__
#define __TOOL2_H__void mytool2();
#endif
#include <stdio.h>
#include "tool2.h"void mytool2() {printf("tool2 print...\n");
}
main.c
#include "tool1.h"
#include "tool2.h"int main(void) {mytool1();mytool2();return 0;
}
对所有文件进行编译:
gcc *.c
执行a.out
[root@HongyiZeng makefile]# ./a.out
tool1 print...
tool2 print...
相关文章:

Linux系统编程学习笔记
1 前言 1.1 环境 平台:uabntu20.04 工具:vim,gcc,make 1.2 GCC Linux系统下的GCC(GNU Compiler Collection)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执…...
vue3 excel 文件导出
//文件导出 在index.ts 中 export function downloadHandle(url: string,params?:object, filename?: string, method: string GET){ try { downloadLoadingInstance ElLoading.service({ text: "正在生成下载数据,请稍候", background: "rgba…...
优雅的代码规范
在软件开发中,优雅的代码规范可以帮助我们写出既美观又实用的代码。 以下是提升代码质量的建议性规范: 命名清晰: 使用描述性强的命名,让代码自我解释。 简洁性: 力求简洁,避免冗余,用最少的代…...

JVM、JRE 和 JDK 的区别,及如何解决学习中可能会遇到的问题
在学习Java编程的过程中,理解JVM、JRE和JDK之间的区别是非常重要的。它们是Java开发和运行环境的核心组件,各自扮演不同的角色。 一、JVM(Java Virtual Machine) 定义 JVM(Java虚拟机)是一个虚拟化的计算…...

【开源】加油站管理系统 JAVA+Vue.js+SpringBoot+MySQL
目录 一、项目介绍 论坛模块 加油站模块 汽油模块 二、项目截图 三、核心代码 一、项目介绍 Vue.jsSpringBoot前后端分离新手入门项目《加油站管理系统》,包括论坛模块、加油站模块、汽油模块、加油模块和部门角色菜单模块,项目编号T003。 【开源…...
详解 Scala 的泛型
一、协变与逆变 1. 说明 协变:Son 是 Father 的子类,则 MyList[Son] 也作为 MyList[Father] 的 “子类”逆变:Son 是 Father 的子类,则 MyList[Son] 作为 MyList[Father] 的 “父类”不变:Son 是 Father 的子类&…...
【本周面试问题总结】
01.如何判断链表中是否有环 ①穷举遍历:从头节点开始,依次遍历单链表中的每一个节点。每遍历到一个新节点,将新节点和此前节点进行比较,若已经存在则说明已被遍历过,链表有环。 ②快慢指针:创建两个指针&am…...

SaltStack
SaltStack 官方文档 1.简介 作用:批量处理状态管理(配置管理)事件驱动(通过事件触发操作)管理私有云/公有云 yum仓库:http://repo.saltstack.com 安装1.master和minionrpm --import https://repo.saltproj…...

【Rust日报】Rust 中的形式验证
文章 - 未来的愿景:Rust 中的形式验证 这篇文章回顾了形式化验证的基本概念,作者展示了如何使用 Hoare triples 来描述和推理程序的正确性,以及如何使用分离逻辑来解决验证的复杂性。文章还解释了为什么 Rust 适用于形式化验证,以…...
vue3项目中新增修改时使用nextTick时遇到的问题
前提 页面是个列表页,需要实现增删改查,新增和修改使用表单提交 关键代码如下 // html部分,新增、修改的表单 <el-dialogv-model"dialogVisible2":title"addTitle"width"600"class"update-shujuji-d…...
算法训练 | 二叉树Part7 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数
目录 530.二叉搜索树的最小绝对差 数组法 双指针法 ⭐ 迭代法 501.二叉搜索树中的众数 双指针法 迭代法 530.二叉搜索树的最小绝对差 题目链接:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) 文章讲解:代码随想录 数组…...

C++面向对象程序设计 - 标准输出流
在C中,标准输出流通常指的是与标准输出设备(通常是终端或控制台)相关联的流对象。这个流对象在C标准库中被定义为std::cout、std::err、std::clog,它们是std::ostream类的一个实例。 一、cout,cerr和clog流 ostream类…...
警惕Mallox勒索病毒的最新变种hmallox,您需要知道的预防和恢复方法。
引言 : 在数字化时代,数据已成为企业和个人最宝贵的资产之一。然而,随着技术的不断发展,网络威胁也日益猖獗,其中.hmallox勒索病毒以其独特的加密手段和狡猾的传播方式,成为了网络安全领域的一颗“隐形炸弹…...
2024年华为OD机试真题-火星文计算-C++-OD统一考试(C卷D卷)
题目描述: 已知火星人使用的运算符为#、$,其与地球人的等价公式如下: x#y = 4*x+3*y+2 x$y = 2*x+y+3 1、其中x、y是无符号整数 2、地球人公式按C语言规则计算 3、火星人公式中,#的优先级高于$,相同的运算符,按从左到右的顺序计算 现有一段火星人的字符串报文,请…...

3.00001 postgres如何初始化系统参数?
文章目录 加载参数整体流程参数结构举例:ConfigureNamesBool 初始化参数 InitializeGUCOptionsbuild_guc_variablesInitializeOneGUCOptionInitializeGUCOptionsFromEnvironment 命令行添加SelectConfigFiles配置 加载参数整体流程 我们先看下guc参数是如何管理的。…...

C# 读取 CSV 文件的方法汇总
文章目录 1. 使用System.IO命名空间中的类2. 处理标题行和指定列3. 使用CsvHelper库4. 高级功能和异常处理5. 使用 LINQ6. 总结 CSV(Comma-Separated Values,逗号分隔值)文件是一种简单的文本文件格式,用于存储表格数据。在C#中&a…...
element+ 引入图标报错 Failed to resolve import “@element-plus/icons-vue“ from “
element 引入图标报错 Internal server error: Failed to resolve import “element-plus/icons-vue” from “src\components\TimeLine.vue”. Does the file exist? 原因:element-plus需要单独引入 icons 文档 pnpm install element-plus/icons-vue之后就可以…...
Github 2024-05-25 开源项目日报 Top10
根据Github Trendings的统计,今日(2024-05-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3TypeScript项目3非开发语言项目1HTML项目1Rust项目1Go项目1Jupyter Notebook项目1Java项目1Angular文档:交付Web应用程序的自信之选…...

VPN的详细理解
VPN(Virtual Private Network,虚拟私人网络)是一种在公共网络上建立加密通道的技术,通过这种技术可以使远程用户访问公司内部网络资源时,实现安全的连接和数据传输。以下是对VPN的详细介绍: 选择代理浏览器…...
java后端轮播图的设计
对于表示轮播图位置这种有限且较小范围的数据,一般可以使用整数类型来表示。考虑到位置序号一般是非负整数且数量较少,可以选择使用小范围的整数类型,如下: 整数类型: 对于Java中,可以考虑使用 int 类型来表示位置序号…...
如何查询服务器的端口号
要查询服务器上某个服务正在使用的端口号,可以使用几个不同的工具和方法,具体方法取决于你对服务器的访问权限以及具体的操作系统。以下是一些常用的方法: 1. 在Linux系统上 1.1 使用 netstat 命令(需要管理员权限)&…...
nt!MiInitializeSystemCache函数分析之PointerPte->u.List.NextEntry的由来
第一部分: 1: kd> dd 0xc0304200 c0304200 c10c0000 00000000 00000000 00000000 c0304210 00000000 00000000 00000000 00000000 c0304220 00000000 00000000 00000000 00000000 c0304230 00000000 00000000 00000000 00000000 c0304240 00000000 00000000…...
Redis 插入中文乱码键
Java 代码: Bean// 静态代理模式: Redis 客户端代理类增强public StringRedisTemplateProxy stringRedisTemplateProxy(RedisKeySerializer redisKeySerializer,StringRedisTemplate stringRedisTemplate,RedissonClient redissonClient) {stringRedisTemplate.setK…...

华为OD机试真题——二叉树中序遍历(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《二叉树中序遍历》: 目录 …...
Hive在实际应用中,如何选择合适的JOIN优化策略?
在实际应用中选择Hive JOIN优化策略时,需综合考虑数据规模、分布特征、表结构设计、集群资源及业务需求。以下是具体的决策流程和参考标准: 一、数据特征分析 1. 统计数据规模 通过DESCRIBE FORMATTED table_name查看表大小和分区信息。使用SELECT CO…...

AWS EC2 实例告警的创建与删除
在AWS云环境中,监控EC2实例的运行状态至关重要。通过CloudWatch告警,用户可以实时感知实例的CPU、网络、磁盘等关键指标异常。本文将详细介绍如何通过AWS控制台创建EC2实例告警,以及如何安全删除不再需要的告警规则,并附操作截图与…...

CRMEB 单商户Java版 v2.3公测版发布,欢迎体验!
当商城管理后台一成不变时,你是否也有过换换风格的想法? 当商城流量激增时,你是否也希望随时观察服务器负载状况,确保系统稳定运行? CRMEB单商户Java版v2.3公测版发布,更新200管理后台页面、弹窗…...
nlp中的频率就是权重吗
🔢 一、“频率”是什么? 在 NLP 中,**词频(frequency)**通常指的是: 某个单词或 token 在语料库中出现的次数(或比例) 举例: "The cat sat on the mat. The cat i…...

榕壹云物品回收系统实战案例:基于ThinkPHP+MySQL+UniApp的二手物品回收小程序开发与优化
摘要:本文深入解析了一款基于ThinkPHPMySQLUniApp框架开发的二手物品回收小程序——榕壹云物品回收系统的技术实现与商业价值。通过剖析项目背景、核心技术架构、功能特性及系统优势,为开发者与潜在客户提供全面的参考指南,助力资源循环利用与…...

【Node.js】部署与运维
个人主页:Guiat 归属专栏:node.js 文章目录 1. Node.js 部署概述1.1 部署的核心要素1.2 Node.js 部署架构全景 2. 传统服务器部署2.1 Linux 服务器环境准备系统更新与基础软件安装创建应用用户 2.2 应用部署脚本2.3 环境变量管理2.4 Nginx 反向代理配置2…...