现在大多数的程序都是在IDE上进行开发的,预处理、编译、汇编和链接这些过程都有编译器已经设定完成,而实际程序在这个过程发生了什么,我们就无从得知了。但是作为程序员,我们有必要去了解在这个过程中我们的程序都发生了哪些变化。 下面就详细描述每一个步骤发生了什么。 参考《程序员的自我修养》 预处理 1.将所有的#define删除,宏定义进行替换。 2.处理所有条件预编译指令,比如#ifndef ,#define,#if,#elif等。 3.删除所有注释,包括单行注释 // 和 多行注释 /**/。 4.添加行号和文件名标识。 5.保留#program 编译器指令。 6.展开头文件
我们在Windows中有很多的编译环境,大家应该都很熟悉,但是在Linux中,我们怎么写代码呢?
语法: ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。
一个.c源程序需要经过预处理器生成.i文件,再经过编译器生成.s文件,再经过汇编器生成可重定位目标文件.o文件,再与其他.o文件经过链接器生成最终的可执行目标程序。
接下来我们用gcc编译器来运行一下,当然不是要完全编译,而是先让他预处理一下:
1、strcspn 头文件:#inclued<string.h> 定义函数:size_t strcspn(const char *s, const char * reject); 函数说明:strcspn()从参数s 字符串的开头计算连续的字符, 而这些字符都完全不在参数reject 所指的字符串中. 简单地说, 若strcspn()返回的数值为n, 则代表字符串s 开头连续有n 个字符都不含字符串reject 内的字符. 返回值:返回字符串s 开头连续不含字符串reject 内的字符数目. 范例
在学习Makefile之前,首先介绍一下make命令,make命令是GNU的工程化编译工具,它用于编译大量互相关联的源代码,使用它可以实现项目的工程化管理,提高开发效率。
通常我们用IDE写完一个程序后,点击编译按钮的时候,内部到底发生了什么?为什么会生成一个可执行文件?这个过程到底有哪些步骤呢?是很简单还是很复杂呢?这篇文章,我们把这些事情讲清
rmdir是一个与mkdir相对应的命令。mkdir是建立目录,而rmdir是删除命令。
安装的命令是,yum install ~,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突,那么最好,下载安装;如果有,则会给出提示,询问是否要同时安装依赖,或删除冲突的包,你可以自己作出判断;
#运算符 #运算符将宏的一个参数转换为字符串字面量。它仅允许出现在带参数的宏的替换列表中。 #运算符所执行的操作可以理解为”字符串化“。 当我们有一个变量 int a = 10; 的时候,我们想打印出: the value of a is 10 . 就可以写:
来看这篇文章的人,大都应该同意《Unix编程艺术》中提到的那些观点吧。今天就给大家看一个反例:yum 的 $releasever 变量
注意: ①printf函数在stdio.h文件里,需要包含头文件stdio.h ②exit函数在stdlib.h文件里,需要包含头文件stdlib.h文件 ③‘\n'除了换行的作用外,还有刷新缓冲区的功能 ④关于main函数的写法,读者可能见过很多种,包括 void main(void) void main() int main() int main(void) int main(int agrc, char** argv)// char* agrv[] 编者在这里建议读者使用后面两种写法,严格上讲这两种才是标准的。
Linux API 头文件(在 linux-3.19.tar.xz 里)会将内核 API 导出给 Glibc 使用。
Visual Studio Code(简称VS Code)是一个由微软开发,同时支持Windows 、Linux 和 macOS 等操作系统的免费代码编辑器,在2019年的Stack Overflow组织的开发者调研中,VS Code被认为是最受开发者欢迎的开发环境。
netstat 命令用于显示各种网络相关信息,如网络连接, 路由表, 接口状态等等; 列出所有处于监听状态的tcp端口:
使用gcc编译器时,必须给出一系列必要的调用参数和文件名称。不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑。如果使用了多个 -L 的参数来定义库目录,gcc会根据多个 -L 参数的先后顺序来执行相应的库目录。
U-Boot是基于PowerPC、ARM、MIPS 和其他几个处理器的嵌入式板的引导加载程序,可以安装在引导 ROM 中,用于初始化和测试硬件或下载和运行应用代码。U-Boot 的开发与 Linux 息息相关:部分源代码来源于 Linux 源代码树,我们有一些共同的头文件,并专门提供了支持 Linux 镜像的引导。
本质都是程序.....- 指令、程序、可执行程序都是一回事 指令就是序 ..- 安装和卸载是在做什么呢?? 把可执行程序拷贝/除到系统路径下
对于Qt的初学者来说,Qt有很多不熟悉的地方,安装和使用时,都会遇到各种各样的“坑”。这些坑,如果经历过一次,就会发现其实是很简单的问题。但是如果不熟悉,那么可能折腾很久也没解决。因此我把我自己遇到的(也是后来常常被问到的)一些问题放在这里,供大家参考、讨论。
linux作为一款流行的嵌入式系统,目前已经有多种架构的MCU支持Linux移植,arm64就是其中一种。今天在这里想做一个笔记,记录一下完整的arm64移植过程。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
复制: ctrl + insert (有些同学的 insert 需要配合 fn 来按)
vi的工作是在文本缓冲区中实现的,为了帮助用户观看, 可为文本的行设置一个行号, 放在文本的左侧(行首前) 可以用末行命令set来设置和取消:
}内部写了几句
一般来讲函数和宏的使用语法很相似,所以语言本身没法帮我们区分二者,那我们平时的一个习惯是:
STL简称标准模版库,被容纳在C++标准程序库,包含了许多基本数据结构和基本算法,使程序员写起来得心应手。
gcc/g++是Linux中的编译器,vim是Linux中的编辑器。要想将代码运行起来还需要编译才可实现。 本篇文章,主要通过预处理、编译、汇编、链接来介绍gcc/g++。
Linux是一套免费使用和自由传播的Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。支持32位和64位硬件,Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统;Linux存在着许多不同的版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机,可移植性较强。
在C/C++中,所有的代码在输出结果前都需要经过这五个阶段:预编译—>编译—>汇编—>链接—>执行代码。其中前四个阶段是在翻译环境下进行,因为在翻译环境中有编译器和链接器这两个重要工具,二者配合能将文本形式的代码转化为对应的二进制代码和可执行文件;而最后一个阶段是在执行环境中进行的,代码在这个阶段已经打包好了,只需要执行器运行此代码,结果就能很好的输出。可以看出,整个代码运行逻辑是极其严谨和巧妙的。除程序环境外,C/C++在预处理阶段还有各式各样的预处理指令等着我们去发掘,一起来看看吧!
---前面的文章里面,仔细讲了在linux系统对文件的读写操作以及文件管理,为今天要讲的内容作了铺垫(如果您是刚接触这方面的内容,可以先看我之前写的文章,有错误的地方,还望指出来,在这里先说一声谢谢)。好了废话不多说,直接进入主题。
“Mac OS X 内核一共 1300 万行代码,SVN 显示我写了其中 7%。”
*因为在计算机内部,如果每次输出直接输出到屏幕,是非常慢的,因为它是外部设备,输出需要用到CPU的运行,但是一个计算机的快慢也满足短板原理,慢的步骤会决定整个步骤的快慢,
gcc (GNU Compiler Collection) 和 g++ 是 Linux 系统上最常用的编译器。它们是 GNU 组织开发的一套开源编译器工具集。
为Android加入busybox工具可以通过两种方式进入Android的console:
经过汇编以后,我所写的代码已经从自然语言转换成了二进制的机器语言,可以看到此时文件中的内容我们不认识
此篇文章主要会带你介绍 Linux 操作系统,包括 Linux 本身、Linux 如何使用、以及系统调用和 Linux 是如何工作的。
1、NDK开发所需要的工具 windows 需要在windows下的环境 把c代码打包成 手机能用的函数库 首先模拟手机的环境 1 NDK .sh linux 批处理文件 .bat windows 头文件 stdio.h 编译器 interface 库函数 连接器 class 实现类 由于ndk有很多linux的批处理文件 最早基于linux开发 2 工具
头文件拷贝,去注释,条件编译,宏替换 -E让程序翻译到预处理阶段就停下来,-o指明形成的临时文件名称。
代码很简单,native来声明该方法非java方法。static代码块来加载动态库。
预处理器根据宏定义将代码中的宏名称替换为指定的文本。 可以是常量替换,也可以是带参数的宏函数替换 预处理器会根据宏定义展开宏
本文介绍了如何通过修改配置文件、编译内核、创建内核工程、烧写内核到开发板、运行内核、分析内核日志、输出内核转储、调试内核、使用内核调试器等工具和方法,来分析和解决内核问题。
这里可能会产生疑问:test.h里包含了show方法的声明,为什么不依赖这个头文件呢
1 月 2 日,长期从事 Linux 内核开发的 Ingo Molnar 发布了一组大规模的补丁,用来重塑 Linux 内核的头文件层次结构和依赖关系,补丁数量多达 2297 个。这项工作的目标是加快 Linux 内核的构建时间,同时清理一些东西,以解决"依赖性地狱"问题。
在编程的过程中,使用已经封装好的库函数是十分方便的,也是十分高效的,因此会使用函数库是很重要的。在C语言中,函数库文件分为两种类型,一种是静态库(库程序是直接注入目标程序的,不分彼此,库文件通常以.a结尾),另一种是动态库(库程序是在运行目标程序时(中)加载的,库文件通常以.so结尾),下面我们就探索一下这两种库文件的特点和使用方式吧!
我一直在学习Linux 系统,但是最近还要学习51单片机,所以在Linux下给51单片机烧录程序那是非常必要的。
文章涉及的实验环境和代码可以到这个git repo获取: https://github.com/nevermosby/linux-bpf-learning
上次介绍了基础IO(二):Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)
领取专属 10元无门槛券
手把手带您无忧上云