当前位置:文档之家› linphone-android编译过程

linphone-android编译过程

linphone-android编译过程
linphone-android编译过程

编译linphone-android

前阵子公司要求从linphone的官网上把android客户端的源码下载下来,编译好。但是下载好后按照README里面的步骤来做有一些小问题,在网上搜了一下,没有专门介绍怎么编译的帖子,经过研究,全部解决了。所以记录下来帮助同样是刚刚上手的你。(问题比较简单,希望高手不要见笑)。

PS:我是在CentOS6下编译的。Ubuntu下编译的步骤相似,可以参考,而在windows下需要借助Cygwin交叉编译。

一、首先要从github上把源码下载下来,这需要安装git软件,这一步就不多做解释了,你只要百度一下git就可以了。(注意下载好后要配置git下载的路径,这个只要在你想存放的地方右击鼠标init一下就行了)

二、编译前我们要先下载几个依赖库,这其中有autoconf(yum install autoconf), automake (yum install automake),aclocal(yum install aclocal),libtoolize(yum install libtoolize),编译过程中还需要android-ndk-r5b以上版本的ndk支持,我用的是最新的r6b版本。

三、下载好后的源码包,不要做任何修改,按照README里面所说的先运行./prepare_sources.sh,但是你在shell里运行后会发现提示你没有这个文件,不要急,这是因为下载下来的源码包里的文件都是DOS格式的,在Linux下都无法识别,所以导致了路径问题,这时候需要你安装一个dos2unix的软件,在终端里输入yum install dos2unix,安装好后,打开终端,定位到你下载好的linphone-android文件夹根目录,输入find -type f | xargs dos2unix --dos2unix --safe或者find -type f | xargs dos2unix -o,这个两个命令都可以把文件夹里所有的文件转为unix格式。

四、现在可以在linphone-android根目录下右击→在终端中打开,然后输入./prepare_sources.sh,好了,开始准备一些编译所需的文件了,但是运行到需要下载一个文件的时候,会提示文卫文件名太长而报错,没事,只要复制那个文件的下载地址,到浏览器里下载下来放到../linphone-android/submodules/libilbc-rfc3951/download/文件夹里,然后重新执行第三步,好了,这个问题也解决了。prepare_sources.sh也可以运行完毕了。

五、好了做完了prepare_sources.sh,下面我们要开始用ndk编译了,在终端中输入$(your ndk root)/ndk-build,开始编译。(如果你希望你编译好的linphone带有x264编码或者amr编码支持,需要在前面的命令后面加上BUILD_X264=1或者BUILD_AMR=light (代表使用android自带的amr编码库)or full(使用自己写的amr编码库))。点击回车后,就开始ndk编译了,这是个漫长而又焦急的等待,你会发现在这过程中还是要报错得,我们要习惯,哪有一试就成功的呢,好了,这次报的错误是说有个asm_com_offsets.asm文件无法找到,可是你到前面的目录去看,的确是有这个文件的,所以就要去找调用这个文件的文件了,这些文件在/linphone-android/submodules/externals/libvpx/vpx_scale/arm/neon文件夹里所有后缀名为.s的文件,用gedit打开这些文件,在前面有.include这个语句,你会发现""这个符号后面的"已经到下一行去了,,你应该知道咋弄了吧,只要把它移到前面这个语句的尾部,保存,其他的.c文件同样这样操作。

六、OK,这样编译下去,你会发现所有的.so文件都可以生成出来了,然后把这个项目导入到Eclipse下,就可以执行了。

到此,全部工作都已经结束了,编译也完成了,谢谢大家的捧场啊,如果你在编译的过程中还遇到了任何问题也可以联系我wangchen88223@https://www.doczj.com/doc/b716871924.html,,很希望和大家一起研究linphone。

编译原理作业参考答案

第1章引言 1、解释下列各词 源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。 源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。 目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。目标程序 (结果程序)一般可由计算机直接执行。 低级语言:机器语言和汇编语言。 高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。 翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。 编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言), 然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。 解释程序: 以该语言写的源程序作为输入,但不产生目标程序。按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。 2、什么叫“遍”? 指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。 3、简述编译程序的基本过程的任务。 编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。 词法分析:输入源程序,进行词法分析,输出单词符号。 语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语法正确的“程序”。 中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。 优化:对中间代码进行优化处理。 目标代码生成:把中间代码翻译成目标语言程序。 4、编译程序与解释程序的区别? 编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。 5、有人认为编译程序的五个组成部分缺一不可,这种看法正确吗? 编译程序的5个阶段中,词法分析,语法分析,语义分析和代码生成生成是必须完成的。而中间代码生成和代码优化并不是必不可少的。优化的目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标代码。 6、编译程序的分类 目前基本分为:诊断编译程序,优化编译程序,交叉编译程序,可变目标编译程序。

ARM裸机课程c语言之编译链接

c 语言之编译链接 1、C 语言为什么需要编译链接1.1、编译链接的流程(1)编译流程图 (2)编译链接实例 由源码到可执行程序的整个过程:以我们再熟悉不过的hello.c 为例 Hello.c #include int main(int argc,char *argv[]){ printf("hello world.\n");return 0;} 对于这个c 语言程序,我们必须经过一定手段,将其编程二进制可执行文件,然后由系统加载执行。在Linux 系统中,gcc 编译时,gcc 编译程序会读取源代码hello.c 文件,并且将其翻译成一个可执行文件hello,整个过程共四个阶段,由编译工具链完成,在这里我们来完整的看下对hello.c 进行编译链接的四个过程。 .c 源码 预处理器 预处理文 编译器 汇编文 汇编器目标文件.o 链接器 可执行程序 库文件 其他目标代

第一过程:预处理(cpp),在命令行下输入gcc-E hello.c-o hello.i(gcc 预处理)的命令,预处理器会对以#开头的预处理命令进行处理。譬如hello.c 中的#include,预处理器会将系统中的hello.h的具体内容读取到文本中,替换原有的#include。得到一个新的C程序,我们一般称为.i 文件,这里得到的hello.i文件格式如下: Hello.i ... ... extern void funlockfile(FILE*__stream)__attribute__((__nothrow__,__leaf__)); #943"/usr/include/stdio.h"34 #2"hello.c"2 int main(int argc,char*argv[]) { printf("hello world.\n"); return0; } 第二过程:编译(cc),在命令行下输入:gcc-S hello.i-o hello.s(gcc 编译),当然也可以gcc-S hello.c-o hello.s,只是这种方式是由预处理器和编译器一起完成的,编译器将hello.i翻译成了hello.s汇编文件,汇编程序是一条条通用的机器语言指令。 hello.s .file"hello.c" .section.rodata .LC0: .string"hello world." .text .globl main .type main,@function main: .LFB0: .cfi_startproc pushl%ebp .cfi_def_cfa_offset8 .cfi_offset5,-8 movl%esp,%ebp .cfi_def_cfa_register5 andl$-16,%esp subl$16,%esp movl$.LC0,(%esp) call puts movl$0,%eax leave .cfi_restore5

Ubuntu下Android源码修改、编译及运行、launcher定制

环境 Linux 版本:Ubuntu 11.04 (可由10.10的版本进行升级)64位系统 GCC版本:gcc version 4.5.2 Java版本:java version "1.6.0_26" 下载android源码前注意: 1、保证Ubuntu系统中的容量在80G左右,以保证足够的空间来存放android源码以及编译后的相关文件。 2、保证Ubuntu系统进行Internet访问。 联网方法:采用拨号进行连接。相关操作步骤如下所示: 1、虚拟机→设置→硬件→网络适配器→网络连接→桥接 2、启动Ubuntu系统,打开终端(在普通用户下),输入相关命令如下: $ pppoeconf //打开后输入上网账号跟密码,确认保存 $ sudo pon dsl-provider //上网连接命令 经过这两个步骤后就可以进行上网了。 Android源码编译所依赖的tools 01.$ sudo apt-get update 02.$ sudo apt-get -y install git-core 03.$ sudo apt-get -y install gnupg 04.$ sudo apt-get -y install sun-java6-jdk flex 05.$ sudo apt-get -y install bison 06.$ sudo apt-get -y install gperf 07.$ sudo apt-get -y install libsdl-dev 08.$ sudo apt-get -y install libesd0-dev 09.$ sudo apt-get -y install libwxgtk2.6-dev 10.$ sudo apt-get -y install build-essential 11.$ sudo apt-get -y install zip 12.$ sudo apt-get -y install curl 13.$ sudo apt-get -y install libncurses5-dev 14.$ sudo apt-get -y install zlib1g-dev 15.$ sudo apt-get -y install valgrind 注意:(如果是32bit的系统的话,则要更改几个Android.mk文件) 01./external/clearsilver/cgi/Android.mk 02./external/clearsilver/java-jni/Android.mk 03./external/clearsilver/util/Android.mk 04./external/clearsilver/cs/Android.mk 用gedit打开,修改m64为m32即可 另外 将build/core/main.mk中的ifneq (64,$(findstring 64,$(build_arch)))修改为: ifneq (i686,$(findstring i686,$(build_arch)))

编译程序和解释程序

编译程序和解释程序 程序设计语言处理系统是系统软件中的一大类,它随被处理的语言及其处理方法和处理过程的不同而不同。任何一个语言处理系统通常都包括一个编译程序,它把一种语言的程序翻译成等价的另一种语言的程序。被翻译的语言和程序分别称为源语言和源程序,而翻译生成的语言和程序分别称为目标语言和目标程序,按照不同的翻译处理方法,翻译程序可分为以下三类: ⑴从汇编语言到及其语言的翻译程序,称为汇编程序。 ⑵按源程序中语句的执行顺序,逐条翻译并立即执行相关功能的处理程序、称为解释程序。 ⑶从高级语言到汇编语言(或机器语言)的翻译程序,称为编译语言。 除了翻译程序外,语言处理系统通常还包括连接程序(将多个分别编译或汇编过的目标程序和库文件进行组合)和装入程序(将目标程序装入内存并启动执行)等。 由于汇编语言的指令与机器语言指令大体上保持一一对应关系,因而汇编程序较为简单,一下只对解释程序和编译程序做简单说明。 1、解释程序 解释程序对源程序进行翻译的方法相当于两种自然语言间的口译。解释程序对源程序的语句从头到尾逐句扫描、逐句翻译、并且翻译一句执行一句,因而这种翻译方式并不形成机器语言形式的目标程序。 解释程序的优点是实现算法简单,且易于在解释过程中灵活方便地插入所需要的修改和测试措施;其缺点是运行效率低。例如,对于源程序中需要多次重复执行的语句,解释程序将要反复的取出、翻译和执行它们。根据这些特点,解释程序通常适合于以交互方式工作的、或在测试状态下运行的、或运行时间与解释时间差不多的程序。 2、编译程序 编译程序对源程序进行解释的方法相当于笔译。在编译程序的执行过程中,要对源程序扫描一遍或几遍,最终形成一个可在具体计算机上执行的目标程序。编译程序的实现算法较为复杂,但通过编译程序的处理可以产生高效运行的目标程序,并把它保存在磁盘上,以备多次执行。因此,编译程序更适合于翻译那些规模大、结构复杂、运行时间长的大的应用程序。

Fluent_UDF_第七章_UDF的编译与链接

第七章 UDF的编译与链接 编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。 _ 第 7.1 节: 介绍 _ 第 7.2 节: 解释 UDF _ 第 7.3 节: 编译 UDF 7.1 介绍 解释的UDF和编译的UDF其源码产生途径及编译过程产生的结果代码是不同的。编译后的UDF由C语言系统的编译器编译成本地目标码。这一过程须在FLUENT运行前完成。在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。 另一方面,解释的UDF被编译成与体系结构无关的中间代码或伪码。这一代码调用时是在内部模拟器或解释器上运行。与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。如果执行速度是所关心的,UDF文件可以不用修改直接在编译模式里运行。 为了区别这种不同,在FLUENT中解释UDF和编译UDF的控制面板其形式是不同的。解释UDF的控制面板里有个“Compile按钮”,当点击“Compile按钮”时会实时编译源码。编译UDF的控制面板里有个“Open按钮”,当点击“Open按钮” 时会“打开”或连接目标代码库运行FLUENT(此时在运行FLUENT之前需要编译好目标码)。 当FLUENT程序运行中链接一个已编译好的UDF库时,和该共享库相关的东西都被存放到case文件中。因此,只要读取case文件,这个库会自动地链接到FLUENT 处理过程。同样地,一个已经经过解释的UDF文件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放到用户的case文件中。只要读取这个case文件,这些函数会被自动编译。 注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算机体系结构、操作系统以及FLUENT软件的可执行版本。一旦用户的FLUENT升级、操作系统改变了或者运行在不同的类型的计算机,必须重新编译这些库。

编译和解释的区别

编译和解释的区别 编译和解释的区别在哪?编译器是把源程序的每一条语句都编译成机器语言,并保存成 二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运 行速度是不如编译后的程序运行的快的. 这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的 形式) 一、低级语言与高级语言 最初的计算机程序都是用0和1的序列表示的,程序员直接使用的是机器指令,无需 翻译,从纸带打孔输入即可执行得到结果。后来为了方便记忆,就将用0、1序列表示的机器指令都用符号助记,这些与机器指令一一对应的助记符就成了汇编指令,从而诞生了汇编语言。无论是机器指令还是汇编指令都是面向机器的,统称为低级语言。因为是针对特定机器的机器指令的助记符,所以汇编语言是无法独立于机器(特定的CPU体系结构)的。但汇 编语言也是要经过翻译成机器指令才能执行的,所以也有将运行在一种机器上的汇编语言翻译成运行在另一种机器上的机器指令的方法,那就是交叉汇编技术。 高级语言是从人类的逻辑思维角度出发的计算机语言,抽象程度大大提高,需要经过 编译成特定机器上的目标代码才能执行,一条高级语言的语句往往需要若干条机器指令来完成。高级语言独立于机器的特性是靠编译器为不同机器生成不同的目标代码(或机器指令)来实现的。那具体的说,要将高级语言编译到什么程度呢,这又跟编译的技术有关了,既可以编译成直接可执行的目标代码,也可以编译成一种中间表示,然后拿到不同的机器和系统上去执行,这种情况通常又需要支撑环境,比如解释器或虚拟机的支持,Java程序编译成bytecode,再由不同平台上的虚拟机执行就是很好的例子。所以,说高级语言不依赖于机器,是指在不同的机器或平台上高级语言的程序本身不变,而通过编译器编译得到的目标代码去适应不同的机器。从这个意义上来说,通过交叉汇编,一些汇编程序也可以获得不同机器之间的可移植性,但这种途径获得的移植性远远不如高级语言来的方便和实用性大。 二、编译与解释 编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。这只是表象,二者背后的最大区别是:对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时 的控制权在用户程序。 解释具有良好的动态特性和可移植性,比如在解释执行时可以动态改变变量的类型、 对程序进行修改以及在程序中插入良好的调试诊断信息等,而将解释器移植到不同的系统上,则程序不用改动就可以在移植了解释器的系统上运行。同时解释器也有很大的缺点,比如执行效率低,占用空间大,因为不仅要给用户程序分配空间,解释器本身也占用了宝贵的系统资源。 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时 计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运 行速度是不如编译后的程序运行的快的.

编译Compile与链接Link

编译Compile与链接Link 要连接要先编译,如果没编译会连接时会自动编译。举个例子,如果你有两个文件,对一个文件进行编译只是讲这个文件编译成了目标文件.obj,但是另外一个文件没有,需对另外一个文件进行编译,可以观察结果输出框的显示,这时连接便会将两个文件连接在一起,才会将互相调用的函数等联系起来,生成.exe。如果不编译直接点连接,系统自动将两个文件编译,并连接,生成.exe文件。 假设两个文件分别是a.cpp,b.cpp,a调用b的函数: 编译a: --------------------Configuration: a - Win32 Debug-------------------- Compiling... a.cpp a.obj - 0 error(s), 0 warning(s) 然后编译b: --------------------Configuration: a - Win32 Debug-------------------- Compiling... b.cpp b.obj - 0 error(s), 0 warning(s) 然后连接: --------------------Configuration: a - Win32 Debug-------------------- Linking... a.exe - 0 error(s), 0 warning(s) 假如编译一个后直接连接: 编译a:无变化 --------------------Configuration: a - Win32 Debug-------------------- Compiling... a.cpp a.obj - 0 error(s), 0 warning(s) 直接连接: --------------------Configuration: a - Win32 Debug-------------------- Compiling... b.cpp Linking... a.exe - 0 error(s), 0 warning(s) 如果两个都不编译,直接点连接: --------------------Configuration: a - Win32 Debug-------------------- Compiling... a.cpp b.cpp Linking... a.exe - 0 error(s), 0 warning(s) 注意:假如文件没有被修改的话,编译一次后不会再进行编译了,可以直接连接,如果这时不编译,直接点连接,也只是连接,没有编译过程。 编译.h文件会提示不能编译,因为.h一般存放的是函数的声明,类的定义等,系统不会编译,但是可以在头文件中点连接进行整个程序的编译连接过程。

Android系统编译过程中常见问题汇总(2)

android源码编译常见问题 分类:android中级2013-03-09 16:20 397人阅读评论(2) 收藏举报编译过程: (在Ubuntu 11.04 64位机器上编译) 1. source build/envsetup.sh //初始化与环境envsetup.sh脚本 初始化完成,显示如下 including device/samsung/maguro/vendorsetup.sh including device/samsung/tuna/vendorsetup.sh including device/ti/panda/vendorsetup.sh including sdk/bash_completion/adb.bash 2. lunch full-eng //选择的目标 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.0.1 TARGET_PRODUCT=full TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=ITL41D ============================================ //建立与一切使。GNU的make -JN参数可以并行处理任务,它是共同使用的任务数, //N的1倍和2倍之间是被用于建立计算机硬件线程数量。例如在E5520双机(2个CPU, //每个CPU 4核,每核心2线程),最快的构建与命令之间的J16和 -J32。 3. make -j4 编译完成

编译原理课后习题答案-清华大学-第二版

第1章引论 第1题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1) 编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2) 源程序:源语言编写的程序称为源程序。 (3) 目标程序:目标语言书写的程序称为目标程序。 (4) 编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5) 后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6) 遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第2题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 答案: 一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误进行适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。 注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚,就回答八部分。 第3题 何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 答案: 翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程序和汇编程序等。 编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编写的目标程序的翻译程序。 解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:一种方式是,源程序功能的实现完全由解释程序承担和完成,即每读出源程序的一条语句的第一个单词,则依据这个单词把控制转移到实现这条语句功能的程序部分,该部分负责完成这条语句的功

编译原理第二版课后习答案

《编译原理》课后习题答案第一章 第 1 章引论 第 1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第 2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程 序的总体结构图。 答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式 的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。 目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的 各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源

在Ubuntu上编译android

在Ubuntu7.10上编译android 1 概述 上个星期看到android开放源代码的消息,虽然觉得Google的这个动作会对业界产生很大影响,但没有时间仔细看,只浏览了Project layout。今天上午一个网友在mail中说已经编译、运行过android。我趁着中午休息时间,在一个Ubuntu7.10的虚拟机上编译、运行了一下。 我在这个虚拟机上编译过openmoko、poky。相对于这两个使用OpenEmbedded的平台,android的编译要简单一些,快一些。我在编译openmoko和poky时,将所有下载包都保存在一个目录中,将编译目录的sources子目录指向这个目录。这样做,一方面即使以后有些链接失效,也还可以编起来(其实编译时都不需要连接外网);另一方面在重新编译时,不用重新下载,可以加快编译速度。即使这样,完全编译一次poky也要一个晚上。编译android时,下载用了1个小时,编译也只需要1个小时。 2 编译中的两个小问题 2.1 python和JDK Google网站对编译过程的介绍还是很清晰的。不过在介绍其它软件包时,都给出了apt-get命令,却单独给出了python和JDK的链接地址,容易对读者产生误导,以为要手工安装这两个软件。其实这两个软件也应该通过apt-get安装。特别是python,如果从源代码安装,可能因为依赖其它软件,导致一些组件编译失败,影响android的编译。而且python 2.6的源代码包没有提供make uninstall,卸载也比较麻烦。其实我们只需要一个apt-get命令,就可以安装所有依赖的软件。 2.2 "fatal: git 1.5.4 or later required" 在Ubuntu7.10上执行repo init时,会出现"fatal: git 1.5.4 or later required"的错误提示。在Ubuntu8.04上编译没有这个问题。下面的流程里会介绍怎样解决这个问题。 3 在Ubuntu7.10上的编译流程

C、C++程序编译过程

C/C++程序编译过程 学习各种外挂制作技术,马上去百度搜索"魔鬼作坊"点击第一个站进入、快速成为做挂达人。 当我们进行编译的时候,要使用一系列的工具,我们称之为工具链。 其中包括: 预处理器CPP 编译器gcc/g++ 汇编器as 连接器ld 一个C/C++程序编译过程包括下面几个阶段: 1.预处理预处理器cpp将对源文件中的宏进行展开。 2.编译gcc将c文件编译成汇编文件。 3.汇编汇编器as将汇编文件编译成机器码。 4.连接链接器ld将目标文件和外部符号进行连接,得到一个可执行二进制文件。 下面以一个很简单的hello.c来探讨这个过程。 #include #define BUFSIZE1024 int main(int argc,char*argv[]) { char hello[BUFSIZE]="Hello my friend!"; printf("%s\n",hello); return0; }

1.预处理(预处理器cpp): gcc会首先调用CPP进行预处理: [butbueatiful@xt myhello]$cpp hello.c>hello.i 或 [butbueatiful@xt myhello]$gcc-E hello.c>hello.i 我们用vi hello.i查看hello.i的内容如下: …… int main(int argc,char*argv[]) { char hello[1024]="Hello my friend!"; printf("%s\n",hello); return0; } 我们可以看到,文件中宏定义BUFSIZE出现的位置被1024替换掉了,其它的内容保持不变。 2.gcc将c文件编译成汇编文件(编译器gcc): 接下来gcc会执行 [butbueatiful@xt myhello]$gcc-S hello.i#得到汇编文件hello.s 3.as将汇编文件编译成机器码(汇编器as): [butbueatiful@xt myhello]$as hello.s-o hello.o 得到输出文件为hello.o hello.o中为目标机器上的二进制文件

编译原理练习题参考答案

一、填空题: 1-01.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,之间代码生成,代码优化等几个基本阶段,同时还会伴有表格处理和出错处理 . 1-02.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序 ,则其翻译程序称为编译程序. 1-03.编译方式与解释方式的根本区别在于是否生成目标代码 . 1-04.翻译程序是这样一种程序,它能够将用甲语言书写的程序转换成与其等价的用乙语言书写的程 序 . 1-05.对编译程序而言,输入数据是源程序 ,输出结果是目标程序 . 1-06.如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段: 编译阶段和运行阶段 .如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分为三个阶段: 编译阶段 , 汇编阶段和运行阶段 . 1-07.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。 1-08.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。其中,词法分析器用于识别单词。 1-09.编译方式与解释方式的根本区别为是否生成目标代码。 2-01.所谓最右推导是指:任何一步α β都是对α中最右非终结符进行替换的。 2-02.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。 2-03.产生式是用于定义语法成分的一种书写规则。 2-04.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为:L(G)={x│S x,x∈V T*} 。 2-05.设G是一个给定的文法,S是文法的开始符号,如果S x (其中x∈V*),则称x是文法的一个句型。 2-06.设G是一个给定的文法,S是文法的开始符号,如果S x(其中x∈V T*),则称x是文法的一个句子。 3-01.扫描器的任务是从源程序中识别出一个个单词符号。 4-01.语法分析最常用的两类方法是自上而下和自下而上分析法。 4-02.语法分析的任务是识别给定的终极符串是否为给定文法的句子。 4-03.递归下降法不允许任一非终极符是直接左递归的。 4-04.自顶向下的语法分析方法的关键是如何选择候选式的问题。 4-05.递归下降分析法是自顶向上分析方法。 4-06.自顶向下的语法分析方法的基本思想是:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。 5-01.自底向上的语法分析方法的基本思想是:从给定的终极符串开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。 5-02.自底向上的语法分析方法的基本思想是:从输入串入手,利用文法的产生式一步一步地向上进行直接归约,力求归约到文法的开始符号。

C++编译连接详解

C++程序从编译到链接然后再到调用的整个过程如下: 注:这里只是研究C++的主流编译过程,与Java没有任何关系,因为使用的技术完全不一样(Java是编译和解释结合的语言)。并且由于不同的编译器厂商对于程序的编译过程不尽相同,但是主要流程还是一样的。 其实长久以来我就一直很不清楚obj文件的内容到底是什么,有人说是汇编,有人说是机器语言。如果是机器语言的话,那编译的过程是怎样加入操作系统信息的呢?因为这个问题的不断扩展和困扰,便决定彻底研究一下,网上几乎找不到相关资料,作者参照了基本系统编程的书籍后自行整理而来,数目见底,仅供参考,欢迎讨论。 一个C++工程中会存在cpp文件,头文件,库文件。 1.首先经历的是预处理过程,将头文件加载进来,并且将各种#define信息代入。这时会见不到头文件,工程经过处理后会生成以cpp文件为基础的编译单元。有人可能会问那么头文件到哪里去了。其实头文件将cpp文件中的#include替换掉了。因此在以后的编程中需要严格注意include的先后顺序。因为C++语言是一种很注重申明的语言,为什么会这样这与程序的编译过程和链接过程的算法有关。貌似话题有点转远了,其实在这个阶段

是生成一个个独力的编译单元。 2.在编译单元生成之后,便是将编译单元进行编译,其实对于主流的编译其实存在两个阶段,首先是生成汇编语言,然后使用汇编器生成机器语言。其实这里要讲解的是汇编语言怎么变成机器语言的呢。机器语言顾名思义就是0101的二进制代码。对于一个类似于MOV AX,BX(这里写的是Intel 80x86的汇编代码,其实几乎每一种不同架构的芯片的汇编语言不怎么一样)的代码而言就是将MOV和AX和BX原封不动的用0101替换掉,如MOV 代码是35的话AX为01,BX为10的话翻译的机器代码就是350110,二进制也就是001101010000000100010000。 3.接下来的任务是链接。链接的过程如下所示: 因为篇幅太长,请看附件。 其实链接的任务是生成可执行文件。 其实我的一些不确认也就在这个地方。其实每一个程序都肯定有操作系统的一些信息,比如说程序的运行环境是DOS还是Windows程序,程序的大小等。我认为编译的整个过程中应该是在最后生成可执行文件的时候加入的。 以上便是对于编译,链接的整个过程。个人意见,仅作参考。

android4.1编译

Android 4.1.4 编译 1、下载源码: 我是在ics版本的基础上通过repo sync更新,发现有了an droid 4_1_r1的分支,等待更新完,repobranch切换分支,然后.Build/envsetup.she然后lunchi选择full-eng最后make,过一会报错。提示: build/core/product_config.mk:193:***_nic.PRODUCTS.[[build/target/product/v box_x 86.mk]]: "frameworks/native/build/phone-xhdpi-1024-dalvik-heap.mk" does not exist. Stop.** Don't have a product spec for: 'full' ** Do you have the right repo manifest? Google baidu bing 了大半天终于在an droid的bug单中找到了这条bug,解答是源码不全。愁了半天,repo sync都是最新的,愁了半天,最后再ics的repo 中重新下了个android 4.1.4的分支。 repoinit-uhttps: 4.1.1_r4 repo sync 下载3个小时,终于下载完成,本来下载源码需要很长时间5?10个小 时,由于再ics的基础上下载,只需要把patch下载就行了(repo会自动完成)。兴奋啊,赶紧. Build/envsetup.sh lunch 1 full-eng

/bin/bash: prebuilts/gcc/linux-x86/arm/arm-linux-androideabi- 4.6/bin/arm-linux- androideabi-gcc: 无法执行二进制文件 /bin/bash: prebuilts/gcc/linux-x86/arm/arm-linux-androideabi- 4.6/bin/arm-linux- androideabi-gcc: 无法执行二进制文件 /bin/bash: prebuilts/gcc/linux-x86/arm/arm-linux-androideabi- 4.6/bin/arm-linux- androideabi-gcc: 无法执行二进制文件 先没管它,继续机制行 make clean make -j8 过了几分钟提示错误:hostStaticLib: libhost(out/host/linux- x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a) ERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc 2.7- 4.6/bin/x86_64-linux-ar only run on 64-bit linux make: ***[out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a] 错误 1 host C: emulator-target-i386 <= external/qemu/cpus.c host C: emulator-target-i386 <= external/qemu/arch_init.c host C: emulator-target-i386 <= external/qemu/os-posix.c host C:

C语言编译过程总结详解

C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。过程图解如下: 从图上可以看到,整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。 编译过程 编译过程又可以分成两个阶段:编译和会汇编。 编译 编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段: 第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。如#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中。这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。 主要是以下几方面的处理: (1)宏定义指令,如 #define a? b 对于这种伪指令,预编译所要做的是将程序中的所有a用b替换,但作为字符串常量的 a 则不被替换。还有 #undef,则将取消对某个宏的定义,使以后该串的出现不再被替换。 (2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。 这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。 (3)头文件包含指令,如#include "FileName"或者#include 等。 在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在 /usr/include目录下。在程序中#include它们要使用尖括号(< >)。另外开发人员也可以定义自己的头文件,这些文件一般与c源程序放在同一目录下,此时在#include中要用双引号("")。 (4)特殊符号,预编译程序可以识别一些特殊的符号。 例如在源程序中出现的LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。 预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。 第二个阶段编译、优化阶段,经过预编译得到的输出文件中,只有常量;如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,}, +,-,*,\等等。

编译与解释的区别

计算机并不能直接地接受和执行用高级语言编写的源程序,源程序在输入计算机时,通过"翻译程序"翻译成机器语言形式的目标程序,计算机才能识别和执行。这种"翻译"通常有两种方式,即编译方式和解释方式。编译方式是指利用事先编好的一个称为编译程序的机器语言程序,作为系统软件存放在计算机内,当用户将高级语言编写的源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得结果。解释方式是指源程序进入计算机后,解释程序边扫描边解释,逐句输入逐句翻译,计算机一句句执行,并不产生目标程序。如PASCAL、FORTRAN、COBOL等高级语言执行编译方式;BASIC语言则以执行解释方式为主;而PASCAL、C语言是能书写编译程序的高级程序设计语言。 编译程序、解释程序、汇编程序是3种语言处理程序。其区别主要为:汇编程序(为低级服务)是将汇编语言书写的源程序翻译成由机器指令和其他信息组成的目标程序。解释程序(为高级服务)直接执行源程序或源程序的内部形式,一般是读一句源程序,翻译一句,执行一句,不产生目标代码,如BASIC解释程序。编译程序(为高级服务)是将高级语言书写的源程序翻译成与之等价的低级语言的目标程序。编译程序与解释程序最大的区别之一在于前者生成目标代码,而后者不生成;此外,前者产生的目标代码的执行速度比解释程序的执行速度要快;后者人机交互好,适于初学者使用。用COBOL、FORTRAN等语言编写的程序考虑到执行速度一般都是编译执行。 解释:程序运行时,取一条指令,将其换化为机器指令,再执行这条机器指令。编译:程序运行时之前,将程序的把有代码编译为机器代码,再运行这个程序。计算机并不能直接地接受和执行用高级语言编写的源程序,源程序在输入计算机时,通过"翻译程序"翻译成机器语言形式的目标程序,计算机才能识别和执行。这种"翻译"通常有两种方式,即编译方式和解释方式。 编译方式是指利用事先编好的一个称为编译程序的机器语言程序,作为系统软件存放在计算机内,当用户将高级语言编写的源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得结果。 解释方式是指源程序进入计算机后,解释程序边扫描边解释,逐句输入逐句翻译,计算机一句句执行,并不产生目标程序。如PASCAL、FORTRAN、COBOL等高级语言执行编译方式;BASIC语言则以执行解释方式为主;而PASCAL、C 语言是能书写编译程序的高级程序设计语言。 简单的说,编译就是全文翻译,全部翻译完才执行。解释就相当于同声翻译,边翻译边执行。

相关主题
文本预览
相关文档 最新文档