编译程序

gnu_make 1

旧时模样 提交于 2020-03-29 00:52:38
序 言 本系列笔记来自于徐海兵的《 GNU make 中文手册》,在此首先感谢徐海兵对于 Info make 的翻译。 第一章 概述 1.1 概述 GNU make :构建、管理工程; makefile :描述整个工程的编译、链接等规则; make :命令工具,解释 makefile 中的指令 / 规则;不仅仅用来管理 C 语言工程。 1.2 准备知识 编译:源文件 - 生成 .o 链接: .o 、库 - 可执行程序, ld 工具; 静态库:多个 .o 文件的归档, ar 工具; 动态库:也是多个 .o 文件的集合,但生成方式特殊; 第二章 GNU make 介绍 2.1 makefile 简介 make 通过比较对应文件(目标和依赖)的最后修改时间, 来决定哪些文件需要更新; make 命令也可以通过命令行参数指定需要重新编译的文件; make 根据 makefile 中的规则描述,执行相关的命令来完成指定的任务; 首次编译:对所有源文件进行编译,并链接生成可执行程序; 非首次编译:重新编译自上次 make 之后修改过的源文件、包含了修改过的头文件的源文件; 自上次 make 之后没有修改的文件,不做任何工作; 2.2 makefile 规则介绍 Target... : Prerequisites... Command …... 目标 Target :最终可执行程序文件名

GNU Makeflie

丶灬走出姿态 提交于 2020-03-29 00:52:13
简介   Gnu Make主要用于构建和管理程序包。Makefile文件描述了整个工程的编译、连接等规则。 其中包括:     工程中的哪些源文件需要编译以及如何编译;     需要创建那些库文件以及如何创建这些库文件;     如何最后产生我们想要得可执行文件。   make是一个命令工具,它解释Makefile中的指令(应该说是规则),Makefile中描述了工程中所有文件的编译顺序、规则。 Makefile有自己的书写格式、关键字、函数。像C语言有自己的格式、关键字和函数一样。 而且在Makefile中可以使用shell所提供的任何命令来完成你想要的工作。 详细请看《GNU make中文手册》。 1.make规则  工程中以下几种文件在执行make时将会被编译:   所有的源文件没有被编译过,则对各个C源文件进行编译并进行链接,生成最后的可执行程序。 每一个在上次执行make之后修改过的C源代码文件在本次执行make时将会被重新编译。 头文件在上一次执行make之后被修改。则所有包含此头文件的C源文件在本次执行make时将会被重新编译。 一个简单的Makefile描述规则组成: TARGET... : PREREQUISITES... COMMAND ... ... target :规则的目标。通常是程序中间或者最后需要生成的文件名。可以是.o文件

iphone-命令行编译之make和Makefile(一)

瘦欲@ 提交于 2020-03-29 00:51:44
一、概念 1. makefile makefile定义了一些规则,来表明文件的相互依赖性,并运行命令,达到--自动化编译 比如指定哪些文件先编译,哪些文件后编译,及哪些文件需要重新编译 2. make 命令工具,用来解释makefile中的规则和指令 make命令执行,需要一个makefile文件,来告诉make命令需要如何编译和链接程序 规则: 1)如果工程没有编译过,则编译所有.m文件并链接 2)如果工程中某几个.m文件被修改,只编译修改的.m文件,并链接 3)如果头文件被修改,则引入这几个头文件的.m文件都需要重新编译,并链接 3. 编译(compile) 把源文件.m文件,转变成(Object File)中间代码文件.o,这个动作叫编译 编译时,编译器需要检查语法,函数和变量是否被声明 4. 链接(link) 把大量的Object File文件合成可执行文件,这个动作叫链接 链接时,链接器去.o文件中链接函数是否实现,和全局变量。如果找不到,报链接错误码 中间文件打包变成库文件(Archive File文件).a,window下为.lib文件 二、Makefile规则 目标文件:依赖文件(tab键)命令 目标文件:依赖文件(tab键)命令 上面的规则,表明文件的依赖关系 1. 目标文件: 可以是:.o文件;可执行文件;标签,即“伪目标” 第一个目标文件就是工程的“终极目标”

Linux内核分析作业第七周

岁酱吖の 提交于 2020-03-28 22:32:45
一、 预处理、编译、链接 gcc hello.c -o hello. gcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤。 预处理 → 编译 → 汇编 → 链接 预处理:编译器将C源代码中包含的头文件编译进来和执行宏替换等工作。 gcc -E hello.c -o hello.i   编译:gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。 gcc –S hello.i –o hello.s-S:该选项只进行编译而不进行汇编,生成汇编代码。   汇编:把编译阶段生成的 .s文件 转成二进制目标代码. gcc –c hello.s –o hello.o   链接:将编译输出 .o文件 链接成最终的可执行文件。 gcc hello.o –o hello   运行:若链接没有-o指明,则生成可执行文件默认为 a.out ./hello 二、可执行文件    1、在windows环境下,只要双击一个.exe的文件就可以执行一个程序,这个以.exe结尾的文件就是一个可执行文件。在andriod系统下,一个.apk的文件就是一个可执行文件,在linux系统下,可执行文件在linux环境下并没有什么特殊的后缀标记,只是在生成该文件时,它的属性设置了可执行(就是‘x’),那么他就是属于可执行文件。   2

模块与包

試著忘記壹切 提交于 2020-03-28 16:18:28
一、模块   1.为什么是模块?   一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。   2.为何要使用模块?   如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。   随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用   3.如何使用模块?   3.1 import #spam.py print('from the spam.py') money=1000 def read1(): print('spam->read1->money',1000) def read2(): print('spam->read2 calling read') read1() def change(): global money money=0   3.1.1 模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的

Python正则表达式指南

限于喜欢 提交于 2020-03-28 05:11:40
本文转自 AstralWind 的博客: Python正则表达式指南 特来收藏 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。 下图展示了使用正则表达式进行匹配的流程: 正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。 下图列出了Python支持的正则表达式元字符和语法: 1.2. 数量词的贪婪模式与非贪婪模式 正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?"

关于计算机编程语言——编译型和解释型_2

家住魔仙堡 提交于 2020-03-28 03:02:29
目前,我们都是采用高级语言编程(写汇编和机器语言的大牛们除外),但是计算机只能识别二进制( 机器语言),不能直接理解高级语言 ,所以我们必须把高级语言“ 翻译”成计算机能够理解的机器语言。 说到“ 翻译“, 其实总共有两种方式: 1. 编译: 通过编译系统(不仅仅只是通过编译器,编译器只是编译系统的一部分)把高级语言“ 翻译 ”成机器语言(具体翻译过程可以参看下图), 把源高级程序编译成为机器语言文件,比如windows下的exe文件。 一个完整的编译系统与 一个用C编写的程序hello.c的编译过程 2. 解释:解释型程序在运行的时候才“ 翻译 ”,比如VB语言,在执行的时候,专门有一个解释器将VB语言“ 翻译 ”成机器语言, 每条语句都是执行的时候才翻译。 编译型与解释型,两者各有利弊: 1、 编译型语言:一次编译完成后,可以直接运行, 程序执行效率高 ; 解释型语言:执行时才“翻译”成机器语言,解析一行,“ 翻译 ”一行,执行一行,程序执行效率相对较低; 但是不能一概而论, 部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。 2、由于 编译型程序 执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它, 像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言;

python模块

感情迁移 提交于 2020-03-28 02:48:46
一 模块介绍 1、什么是模块? 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能。 常见的场景:一个模块就是一个包含了一组功能的python文件,比如spam.py,模块名为spam,可以通过import spam使用。 在python中,模块的使用方式都是一样的,但其实细说的话,模块可以分为四个通用类别:    1 使用python编写的.py文件   2 已被编译为共享库或DLL的C或C++扩展   3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)   4 使用C编写并链接到python解释器的内置模块 2、为何要使用模块? 1、从文件级别组织程序,更方便管理 随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用 2、拿来主义,提升开发效率 同样的原理,我们也可以下载别人写好的模块然后导入到自己的项目中使用,这种拿来主义,可以极大地提升我们的开发效率 ps: 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test

Linux系统C语言开发环境学习

喜你入骨 提交于 2020-03-27 13:25:58
实验四 Linux系统C语言开发环境学习 项目 内容 这个作业属于哪个课程 < 班级课程的主页链接 > 这个作业的要求在哪里 < 作业要求链接接地址 > 学号-姓名 <17043221-汪贵军> 作业学习目标 1.学习Linux系统下C语言开发环境的搭建和使用;2.学习Linux系统环境C语言开发过程。 1.安装C语言开发环境 sudo apt install build-essentia #安装c语言开发环境 gcc -v #查看信息 make -v #查看信息 2.简单C语言练习 1)通过man命令查看帮助文档 man gcc #帮助查看gcc 2)命令行模式简单C语言编译链接等操作 通过vim编辑器编写一个简单的C语言程序,输出自己学号 a)预编译 b)编译 c)汇编 d)链接 可执行文件是二进制文件,同样需要用objdump命令来反汇编该文件分析文件内容 objdump -d test e)运行 ./test #运行文件 3)多文件编译 每个文件的内容分别为 对于多文件编译,我们可以一次编译链接生成可执行文 件,也可以分别编译每个C文件,最后再进行链接得到可执行文件。 前者为一次性编译,可以直接使用源文件链接生成可执行文件。后者为分别编译,会各自生成目标文件,须使用目标文件进行连接生成可执行文件。 编写一个简单的Makefile,通过make工具帮助我们进行编译

Android中的Ninja简介

血红的双手。 提交于 2020-03-26 09:41:00
copy from : https://note.qidong.name/2017/08/android-ninja/ 如果说Makefile是一个DSL,那么Ninja就是一种配置文件。 本文简单介绍Android中的 Ninja 。 Makefile与Ninja的对比 二者最核心的区别,在于设计哲学。 Makefile是设计来给人手写的,而 Ninja 设计出来是给其它程序生成的。 如果说Makefile是C语言,那么 Ninja 就是汇编语言。 如果说Makefile是一个DSL,那么Ninja就是一种配置文件。 Makefile支持分支、循环等流程控制,而 Ninja 只支持一些固定形式的配置。 二者的相同点是,都是为了控制编译流程而设计。 所以,他们的核心功能,都是指定目标,以及目标之间的依赖关系,自动计算执行顺序。 与Makefile相比,由于 Ninja 仅仅专注于核心的功能,所以有轻巧、速度快的优点。 Makefile默认文件名为 Makefile 或 makefile ,也常用 .make 或 .mk 作为文件后缀。 Ninja 的默认文件名是 build.ninja ,其它文件也以 .ninja 为后缀。 执行Makefile的程序,默认是 GNU make ,也有一些其它的实现。 Ninja 的执行程序,就是 ninja 命令。 在Android项目中,