① C语言编译器icc与gcc编译出来的执行文件有什么区别
ICC 是intel 针对intel 体系架构开发的编译器,显然,你的代码,如果运行在intel机器上,intel的人开发的编译器,编译出来的可执行代码效率更高。毕竟人家对intel体系结构这么熟悉,里面的优化说明的,肯定做得不错。但是只能运行在intel体系结构上。比如你的PPC的板子就不能运行了。
GCC是一般性的通用的编译器,可以编译运行在各种体系结构上的代码,比如intel, PPC, ARM, MIPS。它很通用。里面的开发者,当然也熟悉intel 体系架构。但是也要考虑到通用。所以,是一般化的选择。在intel体系结构上运行的话,可能某些地方不如ICC的效率高。
他们实现的原理基本是一致的,但是在细节上,肯定差别很大。比如针对同一种语句,有的会告警,有的不会。有些支持扩展特性。有些不支持。
② ARM有这么多的架构,内核,芯片,请问汇编指令是一样的吗,比如CORTEX M3与CORTEX A8的汇编是一样的吗
兄弟,ARM公司为了便于ARM的推广和用户开发,所以ARM系类的汇编指令集都是一样的,且一套汇编指令集足以,多了反而是累赘。
但不同的编译器可能有不同的汇编格式。
如linux下的GCC编译器下汇编函数是这样的,GCC下的是GUN汇编。
FUNC:
MOV r1,#0x0
LDR r1,#0x30
但在ADS1.2下格式这样的,少了一个冒号,但里面的指令集都是一样的,这点无可异议。
FUNC
MOV r1,#0x0
LDR r1,#0x30
这些编译器的差异和你使用的ARM架构没有关系的
想学ARM入门,推荐周立功系类的书,很多东西讲得很到位,对于初学者很适合,也适合以后的开发,
(纯手写,有问题可继续追问)
③ 请问运行于不同CPU构架的linux,它们的软件可以通用吗
以上回答中jiangtao9999的比较靠谱儿。
是这样:
1、Linux下的软件几乎都是c语言的;
2、如果你学过C语言,找找书应该有这样一个概念:ANSI C,这个是一个C语言的标准,比如printf这个函数就属于标准库(也就是符合ANSI标准的)函数
3、假如你编写了一个软件,代码中仅仅包含ANSI的库函数,那么没有问题,只要是支持C语言的平台,都能正常运行,即:编写了一个简简单单的helloworld到哪里编译运行都没有问题。
【前提是:】编译再运行,不编译就运行是不可以的,比如printf函数在各种架构上的实现方式是不可能相同的,所以需要在arm的编译器上再编译一遍才可以。否则运行不了。
有的软件平台可以不用编译,直接运行,比如jiangtao9999说的java、Python什么的,Java可以实现“一次编译,满哪运行”什么的,而Python则是有了.py源代码就可以无敌了,使用的时候不用你去执行编译命令,直接执行即可。arm上实现这两种语言都是很容易的——下载源代码、编译、安装即可。
4、不同架构的Linux平台都要实现一个编译器,这是很重要的,有了编译器,才可以从源代码安装软件。
5、使用非ANSI库中的函数需要该Linux包含这个函数的实现,否则,编译后的连接将不通过,比如一个软件使用了GTK来实现图形用户界面,那么就需要系统中包含了gtk的库函数,这就叫依赖,安装软件,首先要解决依赖,依赖有时候解决起来很麻烦,所以软件开发过程中尽量减少依赖,这样方便安装。
6、tar.gz这种格式的软件包有可能是源代码,有可能是可执行文件(这是因为那只是一个压缩包,内容是什么不一定),这两者不同。很多软件以tar.gz格式发布源代码,而qq的Linux版本属于可执行文件,在几乎所有Linux平台下面直接双击或者通过命令就可以使用。
7、如果你使用的是rpm包或者deb包或者是tar.gz文件包中可执行文件形式的软件包,而不是tar.gz这种形式的源代码,你需要使用相应的软件包管理器安装就行,
但这不意味着arm版本的deb和x86版本的deb文件是通用的,你能这样用是因为所有的使用x86机器的软件经过编译或者交叉编译(在arm平台上编译x86平台上的软件就叫交叉编译)以后,运行于几乎完全一样的统一的平台上,实现软件和系统的无缝对接,方便了用户——一方面可以不用浪费编译的时间,主要还是方便了那些不会编译软件的人。
8、我也正在学习Linux,所以很多地方不太对,这只是我现在的一些理解。jiangtao9999说的主要是和汇编有关,如果代码的实现主要是在c语言水平,那么就会由编译器屏蔽掉指令集和寄存器什么的。
9、要是在网络回答的答案能改改就好了,这样错误就会少一点。
10、重新罗嗦一遍:
1在不重新编译源代码的情况下,x86下linux的软件不可以运行于arm构架的Linux,即使运行也会奇卡。
2和在编译是否时为X86的CPU构架优化了编译无关。(把我问迷糊了,估计是无关)
3软件在编译时是否为X86的CPU构架而优化主要看作者了,资料可以参看http://www.gentoo.org/doc/zh_cn/gcc-optimization.xml
4和不同的安装包格式有一定关系
5tar.gz格式的软件包不能保证在不同架构的Linux都能运行
6在arm的linux安装时解决依赖以后,乳沟编译通过基本是没什么问题的
7不是所有源代码在arm和x86下编译一下就可以了,还需要做一些努力
8有源代码可以对遇到的不通过的问题逐一解决,理论上可以实现所有软件都能运行
9重新编译过程中如果遇到依赖问题需要逐一解决
④ 相同的cpu架构,在不同的操作系统下生成的程序为什么不可以通用程序不是机器语言么针对硬件操作的阿
相同的CPU架构只是指程序运行的硬件是相同的,而软件(操作系统、操作系统下生成的程序)是不一样的,最后生成的针对硬件操作的机器语言也不一样。生成的程序最后都要汇编成机器语言才能被运行,而机器语言在同一种架构下都可以用.但不能运行在不同架构的平台下。
⑤ C++之IDE和编译器的区别
C++的IDE与编译器的区别:
IDE(Integrated Development Environment)指整合开发环境,也就是用于编辑程式码、开发程式的应用程式,一般包含程式码编辑器与编译器等。C++的IDE有Visual C++6.0、GUIDE等;
编译器(Compiler),则是用于将高阶程式语言程式码翻译成目的码(如机器语言)的程式。C++的编译器是g++。
上面说了,IDE一般包含编译器,也就是说编译器一般属于IDE的一部分。在IDE中可编辑、编译程式码,而编译器只能编译程式码。
ide包括编译器
你描述的IDE是自带了编译器的IDE。
仍有一些IDE只有开发环境,编译器需要另外指定,比如codeblocks,这个IDE可以使用g或者vs编译器或者别的。
还有个例子就是eclipse,本身并不带编译器,需要额外指定。
很明显是Visual c++好,Visual c++功能比Turbo c 2.0强大的多. 两个开发环境的针对性不同,Turbo c 2.0主要针对C进行开发,而Visual c++主要针对C++,但我觉得Visual c++开发C++和C都是很好的工具. Turbo c 2.0比较适合刚刚接触C语言的人来使用,Visual c++可以说是从事商业开发的有效工具
C++的时编译成机器程式码,java的时位元组码,就是虚拟指令,只能在java虚拟上执行。
c++的设计者说过,c++的设计目标是保留c语言的长处如:系统程式设计特性,执行快速快等,再新增上面向物件特性。
语言的特性决定编译器的特点。核心的区别也就上面一句话,具体的差别那得几本书来说明。c编译器通常只编译c档案,c++编译器可以同时编译c和c++档案。
包含关系。
IDE(Integrated Development Environment)指整合开发环境,可以用来编辑程式码,包含有编译器。一般现在最常用的就是VC++和Visual Studio了。
编译器(Compiler),则是用于将高阶程式语言程式码翻译成目的码(如机器语言)的程式。C++一般是g++
1. IDE与硬体平台有关。不同IDE携带的编译器不同。
2. 当然有关。不是半导体厂家提供的,而是编译器开发厂商提供的,也有很多开源的编译器。
3. 有关系。目前最常见的编译器仍然只支援C/C++,宴歼C#的编译器较少而且据说仍不完善。至于Java……哈哈,这种二道贩子还需要劳烦编译器?
4. 可以整合。具体的你需要查阅相应IDE的手册,看看能够整合晌逗冲/新增哪些编译器。
5. 关心到架构就可以。厂商自己扩充套件的东西多半就是些对映,你看厂商的外设就行;而且很多厂商都提供了易于开发的库(当然他们的库也都是够烂的,用熟了以后就可以扔掉)。
6. 是否用作业系统不影响编译器,整体而言也不影响IDE;当然IDE中如果能够新增针对作业系统元件的原生支援(重点是除错方面),用起来就更方便。
优化方式理论上跟编译器和硬体都有关联。程式码级别的优化,要看所使用的编译器实现,Xcode用的是clang,VS用的是windows自己的编译器。。。
汇编级别(指令级别)的优化,要根据硬体对应的指令集实现,指令集根据CPU型别的不同而不同。。。
g++编译时实际上是呼叫g进行编译;
g不能自动连结库档案,一般用g++来连结库档案,非要用g的话,一般使用g -lstdc++命令;
extern “c”对于g和g++没有区别;
实际使用时只需安装g和g++中的一个就行了,如果使用g,编译直接用g就行了,连结要加上-lstdc++引数;如果使用g++,编译时实际还是呼叫g,连结直接使用g++即可;
关于包含库档案标头档案的说明:以gtd库档案为例,库档案一般是libgtd.so格式的档案,如果是libgtd-***.so或者其他格式,可以通过软连结命令转化成libgtd.so格式,ln
-s libgtd-***.so
libgtd.so。一般库档案如果是放在/lib,/usr/lib,/usr/local/lib目录下,则无需额外处理,编译连结时-lgtd会自动找到对应档案不会报错,但是如果不在对应目录,则需要加上-L
/所在目录
-lgtd才能找到对应的库档案。标头档案一般是采用原始档中用#include命令包含,而不是采用-include引数包含,标头档案如果放在/usr/include目录下则会自动找到不会报错,否则编译连结时需要使用-I
/所在目录才能正确找到。
编译连结命令示例:
g++ test.cpp -o test.txt -L /mytest/lib -lgtd -I /mytest/include
⑥ 编译器和IDE的区别 如Eclipse、tasking,GNU,GCC,keil,IAR有什么区别
1. IDE与硬件平台有关。不同IDE携带的编译器不同。
2. 当然有关。不是半导体厂家提供的,而是编译器开发厂商提供的,也有很多开源的编译器。
3. 有关系。目前最常见的编译器仍然只支持C/C++,C#的编译器较少而且据说仍不完善。至于Java……哈哈,这种二道贩子还需要劳烦编译器?
4. 可以集成。具体的你需要查阅相应IDE的手册,看看能够集成/添加哪些编译器。
5. 关心到架构就可以。厂商自己扩展的东西多半就是些映射,你看厂商的外设就行;而且很多厂商都提供了易于开发的库(当然他们的库也都是够烂的,用熟了以后就可以扔掉)。
6. 是否用操作系统不影响编译器,整体而言也不影响IDE;当然IDE中如果能够添加针对操作系统组件的原生支持(重点是调试方面),用起来就更方便。