导航:首页 > 源码编译 > 交叉编译的执行效率

交叉编译的执行效率

发布时间:2023-05-12 22:07:57

㈠ 如何使用交叉编译进行开发

采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的山早主机中进行。
linux下的交叉编译环境重要包括以下几个部分:
1.对目标系统的编译器gcc
2.对目标系统的二进制工具binutils
3.目标系统的标准c库glibc
4.目标系统的linux内核头文件
交叉编译环境的建立步骤
一、下载源代码 下载包括binutils、gcc、glibc及linux内核的源代码(需要注意的是,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致),并设定shell变量PREFIX指定可执行程序的安装路径。
二、编译binutils 首先运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,然后执行make install。
三、配置linux内核头文件
首先执行make mrproper进行清理工作,然后执行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)进行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架构,因为缺省架构为主机的cpu架构),这一步需要根据目标机的实际情况进行详细的配置,笔者进行的实验中目标机为HP的ipaq-hp3630 PDA,因而设置system type为SA11X0,SA11X0 Implementations中选择Compaq iPAQ H3600/H3700。
配置完成之后,需要将内核头文件拷贝到安装目录: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux
四、第一次编译gcc
首先运行configure文件,使用--prefix=$PREFIX参陪搭数指定安装路径,使用--target=arm-linux参数指定目标机类型,并使用--disable-threads、--disable-shared、--enable-languages=c参数,然后执行make install。这一步将生成一个最简的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简的gcc,它只需要具备编译目标机glibc库的能力即可。
五、交叉编译glibc
这一步骤生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。该过程要用到linux内核头文件,默认路径为$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一个名为sys-linux的软连接,使其内核头文件所在的include目录;或者,也可以在接下来要执行的configure命令中使用--with-headers参数指定linux内核头文件的实际路径。
configure的运芦唯拿行参数设置如下(因为是交叉编译,所以要将编译器变量CC设为arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最后,按以上配置执行configure和make install,glibc的交叉编译过程就算完成了,这里需要指出的是,glibc的安装路径设置为$PREFIXARCH=arm/arm-linux,如果此处设置不当,第二次编译gcc时可能找不到glibc的头文件和库。
六、第二次编译gcc
运行configure,参数设置为--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。
运行make install。
到此为止整个交叉编译环境就完全生成了。
几点注意事项
第一点、在第一次编译gcc的时候可能会出现找不到stdio.h的错误,解决办法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthr_posix_h。

㈡ 语言处理系统的基本内容

程序设计语言处理系统主要包括正文编辑程序、宏加工程序、编译程序、汇编程序、解释程序、连接编辑程序、装入程序、编译程序的编译程序、自编译程序、交叉编译程序和并行编译程序等。
正文编辑程序用于创建和修改源程序正文文件。一个源程序正文可以编辑成一个文件,也可以分成多个模块编辑成若干个文件。用户可以使用各种编辑命令通过键盘、鼠标器等输入设备输入要编辑的元素或选择要编辑的文件,正文编辑程序根据用户的编辑命令来创建正文文件,或对文件进行各种删除、修改、移动、复制及打印等操作。和档
宏加工程序把源程序中的宏指令扩展成等价的预先定义的指令序列。对源程序进行编译之前应先对源程序进行宏加工。
编译程序把用高级语言书写的程序翻译成等价的机器语言程序或汇编语言程序。变异过程可分为分析和综合两个部分。分析部分包括词法分析、语法分析和语义分析三步。分析的目的是检察源程序的语法和语义的正确定,并建立符号表、常数表和中间语言程序等数据对象。综合的目的是为源程序中的常数、变量、数组等各种数据对象分配存储空间,并将分析的结果综合成可高效运行的目标程序。汇编程序把用汇编语言书写的程序翻译成等价的机器语言程序。
解释程序按源程序中语句的动态执行顺序,从头开始,翻译一句执行一句,再翻译一句再执行一句,直至程序执行终止。和编译方法根本不同的是,解释方法是边翻译边执行,翻译和执行是交叉在一起的,而编译方法却把翻译和执行截然分开,先把源程序翻译成等价的机器语言程序,这段时间称为编译时刻,然后再执行翻译成的目标程序,这段时间称为运行时刻。正因为解释程序是边翻译边执行,所以要把源程序及其所处理的数据一起交给解释程序进行处理。
编译方法和解释方法各有优缺点。编译方法的最大优点是执行效率高,缺点是运行时不能与用户进行交互,因此比较适用于些规模较大或运行时间较长或要求运行效率较高的程序的语言,更适用于写机器或系统软件和唤备乱支撑软件的语言。解释方法的优点是解释执行时能方便的实现与用户进行交互,缺点是执行效率低,因此比较适用于交互式语言。
连接编辑程序将多个分别编译或汇编过的目标程滚猜序段组合成一个完整的目标程序。组合成的目标程序可以是能直接执行的二进制程序,也可以是要再定位的二进制程序。
装入程序将保存在外存介质上的目标程序以适于执行的形式装入内存并启动执行。
编译程序的编译程序是产生编译程序的编译程序。他接受用某种适当的表示体系描述的某一语言类中任意语言A的词法规则、语法规则、语义规则和(或)代码生规则,并从这些描述产生出用目标语言B写的关于语言A的全部或部分编译程序。这样便可显着提高编译程序的开发效率。
自编译程序是用被编译的语言即源语言自身来书写的编译程序。利用自变异技术,可以从一具有自编译能力的语言L的一个足够小的子集L0的编译程序出发,逐步构造出L的编译程序,也可从L的未优化的编译程序出发,构造优化的编译程序。
交叉编译程序是一种编译程序,它自身在甲机器上运行,生成的目标代码是乙机器的代码。
并行编译程序是并行语言的编译程序,或是将串行语言程序并行化的编译程序,后者又称为自动并行编译程序。
一个程序特别是中、大规模的程序难免没有错误。发现并排除源程序中的错误是语言处理系统的任务之一。通常源程序的语法错误和静态语义错误都是由编译程序或解释程序来发现的。排错能力的大小是评价编译程序和解释程序优劣的重要标志之一。源程序中的动态语义错误通常要借助于在语言中加入某些排错设施如跟踪、截断来发现和排除。处理排错设施的程序是排错程序。

㈢ 如何提高python的运行效率

窍门一:关键代码使用外部功能包

Python简化了许多编程任务,但是对于一些时间敏感的任务,它的表现经常不尽人意。使用C/C++或机器语言的外部功能包处理时间敏感任务,可以有效提高应用的运行效率。这些功能包往往依附于特定的平台,因此你要根据自己所用的平台选择合适的功能包。简而言之,这个窍门要你牺牲应用的可移植性以换取只有通过对底层主机的直接编程才能获得的运行效率。以下是一些你可以选择用来提升效率的功能包:

Cython
Pylnlne
PyPy
Pyrex

这些功能包的用处各有不同。比如说,使用C语言的数据类型,可以使涉及内存操作的任务更高效或者更直观。Pyrex就能帮助Python延展出这样的功能。Pylnline能使你在Python应用中直接使用C代码。内联代码是独立编译的,但是它把所有编译文件都保存在某处,并能充分利用C语言提供的高效率。

窍门二:在排序时使用键

Python含有许多古老的排序规则,这些规则在你创建定制的排序方法时会占用很多时间,而这些排序方法运行时也会拖延程序实际的运行速度。最佳的排序方法其实是尽可能多地使用键和内置的sort()方法。譬如,拿下面的代码来说:

import operator
somelist = [(1, 5,]
在每段例子里,list都是根据你选择的用作关键参数的索引进行排序的。这个方法不仅对数值类型有效,还同样适用于字符串类型。

窍门三:针对循环的优化

每一种编程语言都强调最优化的循环方案。当使用Python时,你可以借助丰富的技巧让循环程序跑得更快。然而,开发者们经常遗忘的一个技巧是:尽量避免在循环中访问变量的属性。譬如,拿下面的代码来说:

lowerlist = ['this', 'is', 'lowercase']
upper = str.upper
upperlist = []
append = upperlist.append
for word in lowerlist:
append(upper(word))
print(upperlist)
#Output = ['THIS', 'IS', 'LOWERCASE']
每次你调用str.upper, Python都会计算这个式子的值。然而,如果你把这个求值赋值给一个变量,那么求值的结果就能提前知道,Python程序就能运行得更快。因此,关键就是尽可能减小Python在循环中的工作量。因为Python解释执行的特性,在上面的例子中会大大减慢它的速度。

(注意:优化循环的方法还有很多,这只是其中之一。比如,很多程序员会认为,列表推导式是提高循环速度的最佳方法。关键在于,优化循环方案是提高应用程序运行速度的上佳选择。)

窍门四:使用较新的Python版本

如果你在网上搜索Python,你会发现数不尽的信息都是关于如何升级Python版本。通常,每个版本的Python都会包含优化内容,使其运行速度优于之前的版本。但是,限制因素在于,你最喜欢的函数库有没有同步更新支持新的Python版本。与其争论函数库是否应该更新,关键在于新的Python版本是否足够高效来支持这一更新。

你要保证自己的代码在新版本里还能运行。你需要使用新的函数库才能体验新的Python版本,然后你需要在做出关键性的改动时检查自己的应用。只有当你完成必要的修正之后,你才能体会新版本的不同。

然而,如果你只是确保自己的应用在新版本中可以运行,你很可能会错过新版本提供的新特性。一旦你决定更新,请分析你的应用在新版本下的表现,并检查可能出问题的部分,然后优先针对这些部分应用新版本的特性。只有这样,用户才能在更新之初就觉察到应用性能的改观。

窍门五:尝试多种编码方法

每次创建应用时都使用同一种编码方法几乎无一例外会导致应用的运行效率不尽人意。可以在程序分析时尝试一些试验性的办法。譬如说,在处理字典中的数据项时,你既可以使用安全的方法,先确保数据项已经存在再进行更新,也可以直接对数据项进行更新,把不存在的数据项作为特例分开处理。请看下面第一段代码:

n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
if char not in myDict:
myDict[char] = 0
myDict[char] += 1
print(myDict)
当一开始myDict为空时,这段代码会跑得比较快。然而,通常情况下,myDict填满了数据,至少填有大部分数据,这时换另一种方法会更有效率。

n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
try:
myDict[char] += 1
except KeyError:
myDict[char] = 1
print(myDict)
在两种方法中输出结果都是一样的。区别在于输出是如何获得的。跳出常规的思维模式,创建新的编程技巧能使你的应用更有效率。

窍门六:交叉编译你的应用

开发者有时会忘记计算机其实并不理解用来创建现代应用程序的编程语言。计算机理解的是机器语言。为了运行你的应用,你借助一个应用将你所编的人类可读的代码转换成机器可读的代码。有时,你用一种诸如Python这样的语言编写应用,再以C++这样的语言运行你的应用,这在运行的角度来说,是可行的。关键在于,你想你的应用完成什么事情,而你的主机系统能提供什么样的资源。

Nuitka是一款有趣的交叉编译器,能将你的Python代码转化成C++代码。这样,你就可以在native模式下执行自己的应用,而无需依赖于解释器程序。你会发现自己的应用运行效率有了较大的提高,但是这会因平台和任务的差异而有所不同。

(注意:Nuitka现在还处在测试阶段,所以在实际应用中请多加注意。实际上,当下最好还是把它用于实验。此外,关于交叉编译是否为提高运行效率的最佳方法还存在讨论的空间。开发者已经使用交叉编译多年,用来提高应用的速度。记住,每一种解决办法都有利有弊,在把它用于生产环境之前请仔细权衡。)

在使用交叉编译器时,记得确保它支持你所用的Python版本。Nuitka支持Python2.6, 2.7, 3.2和3.3。为了让解决方案生效,你需要一个Python解释器和一个C++编译器。Nuitka支持许多C++编译器,其中包括Microsoft Visual Studio,MinGW 和 Clang/LLVM。

交叉编译可能造成一些严重问题。比如,在使用Nuitka时,你会发现即便是一个小程序也会消耗巨大的驱动空间。因为Nuitka借助一系列的动态链接库(DDLs)来执行Python的功能。因此,如果你用的是一个资源很有限的系统,这种方法或许不太可行。

㈣ 脚本程序每次运行都要解释,运行效率为什么会比那些编译后的程序高 那些经过编译的可执行文件不是每次

一句话,条件不同,不能对比。
举例说,一个标准的可以计算PI值得C++程序,用g++进行交叉编译:不同的编译器版本生成的代码,性能有差别;针对不同操作系统,性能有差别。针对不同CPU(X86、Arm、MIPS等)的代码,性能也有差别。

不考虑算法的优化问题,编译优化问题,平台优化问题等等这些,那么可以确定,脚本语言一定慢于编译语言。

有时候上班堵车的时候,走路都比坐车快。但你能说你走比汽车快?

㈤ 电脑培训分享怎样才能提高Python运行效率

python逐渐走入人们的视线,成为热门编程语言,随之而来,加入python培训的准程序员大军也成为社会热点。Python具有许多其他编程语言不具备的优势,譬如能通过极少量代码完成许多操作,以及多进程,能够轻松支持多任务处理。除了多种优势外,python也有不好的地方,运行较慢,下面电脑培训为大家介绍6个窍门,正滑悔可以帮你提高python的运行效率。

1.在排序时使用键


Python含有许多古老的排序规则,这些规则在你创建定制的排序方法时会占用很多时间,而这些排序方法运行时也会拖延程序实际的运行速度。最佳的排序方法其实是尽可能多地使用键和内置的sort()方法。


2.交叉编译你的应用


开发者有时会忘记计算机其实并不理解用来创建现代应用程序的编程语言。计算机理解的是机器语言。为了运行你的应用,你借助一个应用将你所编的人类可读的代码转换成机器可读的代码。有时,你用一种诸如Python这样举正的语言编写应用,再以C++这样的语言运行你的应用,这在运行的角度来说,是可行的。关键在于,你想你的应用完成什么事情,而你的主机系统能提供什么样的资源。


3.关键代码使用外部功能包


Python简化了许多编程任务,但是对于一些时间敏感的任务,它的表现经常不尽人意。使用C/C++或机器语言的外部功能包处理时间敏感任务,可以有效提高应用的运行效率。这些功能包往往依附于特定的平台,因此你要根据自己所用的平台选择合适的功能包。简而言之,这个窍门要你牺牲应用的可移植性以换取让闷只有通过对底层主机的直接编程才能获得的运行效率。


4.针对循环的优化


每一种编程语言都强调最优化的循环方案。当使用Python时,你可以借助丰富的技巧让循环程序跑得更快。然而,开发者们经常遗忘的一个技巧是:尽量避免在循环中访问变量的属性。


5.尝试多种编码方法


每次创建应用时都使用同一种编码方法几乎无一例外会导致应用的运行效率不尽人意。可以在程序分析时尝试一些试验性的办法。譬如说,在处理字典中的数据项时,你既可以使用安全的方法,先确保数据项已经存在再进行更新,也可以直接对数据项进行更新,把不存在的数据项作为特例分开处理。


6.使用较新的Python版本


你要保证自己的代码在新版本里还能运行。你需要使用新的函数库才能体验新的Python版本,然后你需要在做出关键性的改动时检查自己的应用。只有当你完成必要的修正之后,你才能体会新版本的不同。


㈥ 什么是交叉编译,为什么要采用交叉编译

在一个平台架构上,编译另一个平台架构的可执行代码,就是交叉编译。
例如在x86架构的PC上编译arm嵌入式设备的可执行程序。
交叉编译是不得不用,
首先在目标设备的系统还没引导起来的时候,编译目标平台的引导程序,显然只能交叉编译。
还有因为目标设备往往能力太低,没法安装编译器,或者勉强安装了,也慢得像蜗牛。

㈦ 为什么要用交叉编译器

交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。

有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
综上,在嵌入式开发的时候我们就要使用交叉编译器。

㈧ 什么是交叉编译,为什么要使用交叉编译

交叉编译的概念(来自网络):

简单地说,就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
举个例子:
我们在Linux系统比如Ubuntu上编写的C程序完全可以拿到Windows系统上正常运行。

㈨ 什么是GCCGCC有什么作用

GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。

GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。GCC是自由软件过程发展中的着名例子,由自由软件基金会以GPL协议发布。

GCC功能与作用:

1、预处理

命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。

2、编译

用GCC编译C/C++代码时,它会试着用最少的时间完成编译并且编译后的代码易于调试。易于调试意味着编译后的代码与源代码有同样的执行顺序,编译后的代码没有经过优化。

3、连接

当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

4、汇编

汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。

(9)交叉编译的执行效率扩展阅读:

gcc所遵循的部分约定规则:

1、.c为后缀的文件,C语言源代码文件。

2、.a为后缀的文件,是由目标文件构成的档案库文件。

3、.h为后缀的文件,是程序所包含的头文件。

4、.i 为后缀的文件,是C源代码文件且不应该对其执行预处理。

5、.m为后缀的文件,是Objective-C源代码文件。

6、.o为后缀的文件,是编译后的目标文件。

7、.s为后缀的文件,是汇编语言源代码文件。

㈩ golang进行交叉编译

golang进行交叉编译

交叉编译即编译不同操作系统平台的可执激链前行程序

golang执行交叉编译,只需要使用两个变量

- GOOS:目标操作系统 - GOARCH:目标操作系统的架构

根据下面这个表格指定就行了。

其中386指的是32位系统

build命令的用法如下

usage: go build [-o output] [-i] [build flags] [packages]

-o指定文件名,中间可以加一些flag

如果是在linux下面编译win 64位程序,执行明清类似下面的唤扒命令即可。

GOOS=windows GOARCH=amd64 go build test.go -o t.exe

阅读全文

与交叉编译的执行效率相关的资料

热点内容
win10ksm服务器地址 浏览:339
一元二次估算法 浏览:925
一招读懂源码 浏览:126
为什么苹果ipad连接不上服务器 浏览:927
可乐app怎么用卡密 浏览:766
路由器如何打开dhcp服务器地址 浏览:75
谷歌图片怎么搜索app 浏览:863
江苏文件夹模具厂 浏览:464
安卓系统网线拦截怎么关闭 浏览:31
服务器和终端是什么 浏览:516
换安卓苹果照片怎么弄回去 浏览:260
如何向ca中心申请服务器 浏览:187
从java到Android 浏览:551
福建加密app哪个好用 浏览:382
opengl游戏编程徐明亮pdf 浏览:619
单片机row怎么用 浏览:981
虚函数表与反编译 浏览:134
网上的滴滴抢单app是怎么做的 浏览:384
eve手游ios账号怎么登录安卓的 浏览:622
linuxoracle12安装教程 浏览:697