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.outgcc -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...

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

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

相关文章

BIGO前端CICD平台

本文首发于&#xff1a;https://github.com/bigo-frontend/blog/ 欢迎关注、转载。 我是谁 BIGO前端CICD平台&#xff0c;是一个服务于前端团队的全研发周期管理平台&#xff0c;已经是我们团队日常都要使用的工具了。 该平台实现了一键创建项目、发布编排、新建迭代、checkl…

uniapp 使用vuex 在app上能获取到state,小程序获取不到

1. 在根目录下新建store目录, 在store目录下创建index.js定义状态值import Vue from vue; import Vuex from Vuex; import Vuex from vuex; Vue.use(Vuex);const store new Vuex.Store({ state: { login: false, token: , avatarUrl: , userName: }, mutations: { lo…

JavaWeb Servelt原理

Servlet简介: Servlet的主要工作&#xff1a;处理客户端请求&#xff0c;生成动态响应&#xff0c;通常用于扩展基于HTTP协议的Web服务器。 Servlet技术是Java EE规范的组成部分&#xff0c;代表了服务器端的Java程序&#xff0c;主要负责处理来自客户端的Web请求&#xff0c;…

国内信创web中间件生态

国内信创web中间件生态 东方通 官网https://www.tongtech.com/pctype/25.html 宝蓝德 官网https://www.bessystem.com/product/0ad9b8c4d6af462b8d15723a5f25a87d/info?p101 金蝶天燕 官网 https://www.apusic.com/list-117.html 中创 官网http://www.inforbus.com…

数据库数据恢复—空间不足导致sqlserver数据库连接失效的数据恢复案例

数据库数据恢复环境&#xff1a; 某品牌r520服务器&#xff0c;服务器中有7块SAS硬盘&#xff0c;这7块硬盘组建了一组2盘raid1阵列和一组5盘raid5阵列&#xff0c;raid1阵列存储空间安装操作系统&#xff0c;raid5阵列存储空间存放数据。服务器上部署sql server数据库&#xf…

野外作战武器操作3D模拟实操仿真训练以便老兵能适应不同的训练需求

强国必须强军&#xff0c;我国在军事方面的投入持续加大&#xff0c;自然在军事武器培训方面不容忽视&#xff0c;在军事领域&#xff0c;3D模拟展示不仅提升了军事训练的效率&#xff0c;还为我们提供了更加直观、真实的武器体验。 首先&#xff0c;3D军事武器模拟展示能够提供…

Nacos 2.x 系列【6】持久化

文章目录 1. 前言2. Derby3. Mysql3.1 初始化脚本3.2 服务端配置3.3 验证 4. 数据源插件 1. 前言 Nacos中的用户、租户、服务配置等信息&#xff0c;需要使用关系型数据库进行存储&#xff0c;在实际开发中&#xff0c;可能还会面临各种数据库适配问题。 2. Derby Derby是Ap…

Android Studio 中gradle的bin和all区别

1.在android studio中设置安装gradle时&#xff0c;真各种版本看到眼花缭乱&#xff0c;还有疑惑gradle-*.*-all.zip与gradle-*.*-bin.zip的区别是什么。下面解压如下: bin&#xff1a; all: 其实&#xff0c;用bin就可以了&#xff0c;all文件就是多了docs(文档)和src(源码)两…

Linux网络-Socket套接字_Windows与Linux端双平台基于Udp传输协议进行多线程跨平台的服务器与客户端网络通信的简易聊天室实现

文章目录 一、Socket套接字二、socket 常见API1. int socket(int domain, int type, int protocol);2. int bind(int socket, const struct sockaddr *address, socklen_t address_len);struct sockaddr 3. ssize_t recvfrom(int socket, void *restrict buffer, size_t length…

go defer

type _defer struct {siz int32started boolopenDefer boolsp uintptrpc uintptrfn *funcval_panic *_paniclink *_defer }runtime._defer 结构体是延迟调用链表上的一个元素&#xff0c;所有的结构体都会通过 link 字段串联成链表。 只…

【全开源】酒店订单管理系统源码(FastAdmin+ThinkPHP)

一款基于FastAdminThinkPHP开发的旨在为民宿、酒店、宾馆等提供房态、订单、财务、客史等数据化、信息化的智慧管理工具&#xff0c;实现一站式订房管理&#xff0c;帮助酒店、民宿、宾馆提升管理效率&#xff0c;降低管理成本&#xff0c;提升行业竞争力。 打造高效、便捷的酒…

Generate Anything Anywhere in Any Scene #论文阅读

URL https://arxiv.org/pdf/2306.17154 TD;DR 2023 年 6 月 Wisconsin 的文章。围绕 ip 保持做的扩展任务&#xff0c;核心目标是对指定 ip 可以生成任意大小的&#xff08;指定 ip&#xff09;、任意背景的图片&#xff0c;同时可以通过 bbox 控制物体位置和多物体生成。主…

SOLIDWORKS教育版代理商应该如何选择?

SOLIDWORKS作为目前流行的三维设计软件在工程设计&#xff0c;制造和建筑中有着广泛的应用前景。教育版SOLIDWORKS软件是学生及教育机构学习教学的理想平台。 下面介绍几个挑选SOLIDWORKS教育版代理的关键要素: 1、专业知识与经验&#xff1a;代理商应掌握SOLIDWORKS等软件的丰…

ResNet残差网络的学习【概念+翻译】

基于何明凯前辈论文的学习 1.主要内容&#xff08;背景&#xff09; 1、首先提了一个base&#xff1a;神经网络的深度越深&#xff0c;越难以训练。 2、原因&#xff1a;因为随着神经网络层数的增加&#xff0c;通常会遇到梯度消失或梯度爆炸等问题&#xff0c;这会导致训练变…

gem5模拟器入门(三)——在配置脚本中添加Cache

使用gem5模拟器入门(二)——创建一个简单的配置脚本-CSDN博客配置脚本作为起点,本章将介绍一个更复杂的配置。我们将向系统添加一个缓存层次结构,如下图所示。此外,本章还将介绍如何理解gem5的统计输出,并向您的脚本添加命令行参数。 1.创建Cache对象 我们将使用经典的缓…

Robot Framework自动化测试基础入门

1、什么是Robot Framework Robot Framework是一个基于Python的关键字驱动的自动化测试框架。以下是关于Robot Framework的几个特点: 基于关键字驱动: 它允许测试人员使用Python封装关键字,这些关键字可以在非编码环境下被用来构建可执行的测试用例。易于扩展: 作为一个开源工…

20240528解决飞凌的OK3588-C的核心板的TYPE-C1接口识别问题

20240528解决飞凌的OK3588-C的核心板的TYPE-C1接口识别问题 2024/5/28 16:46 缘起&#xff1a; 现阶段碰到的USB相关的问题&#xff1a;&#xff08;LINUX R4版本&#xff09; 1、USB3.0插USB摄像头 lsusb找不到设备 2、刷机口只接了3根线&#xff0c;GND/D/D-&#xff0c;可以…

2024HBCPC:E Breakfast II

题目描述 作为一个合格的大学生&#xff0c;你不仅需要学习成绩好&#xff0c;还需要会买包子和鸡蛋。 今天&#xff0c;又轮到你们给你的导师买早饭了&#xff01; 这一次你们一共需要给导师买 n n n 个包子和 m m m 个鸡蛋&#xff08;请注意&#xff0c;这一次可能不再只…

搭贝财务管理助您轻松掌控财务大局

在当今竞争激烈的商业环境中&#xff0c;有效的财务管理是企业成功的关键之一。搭贝财务管理平台为您提供了一揽子解决方案&#xff0c;助您轻松掌握财务大局&#xff0c;实现财务管控的全面数字化。 &#x1f4c8; 基础信息管理 搭贝财务管理平台首先提供了完善的基础信息管理…

3D开发工具HOOPS在BIM系统中的应用

建筑信息模型是一种革命性的建筑设计、施工和管理方法。它通过创建和利用数字信息来优化建筑项目的设计、施工和运营过程。在这个过程中&#xff0c;3D开发工具HOOPS扮演着至关重要的角色&#xff0c;为BIM系统提供了强大的技术支持和丰富的功能。HOOPS中文网http://techsoft3d…