㈠ C语言编译器icc与gcc编译出来的执行文件有什么区别
ICC 是intel 针对intel 体系架构开发的编译器,显然,你的代码,如果运行在intel机器上,intel的人开发的编译器,编译出来的可执行代码效率更高。毕竟人家对intel体系结构这么熟悉,里面的优化说明的,肯定做得不错。但是只能运行在intel体系结构上。比如你的PPC的板子就不能运行了。
GCC是一般性的通用的编译器,可以编译运行在各种体系结构上的代码,比如intel, PPC, ARM, MIPS。它很通用。里面的开发者,当然也熟悉intel 体系架构。但是也要考虑到通用。所以,是一般化的选择。在intel体系结构上运行的话,可能某些地方不如ICC的效率高。
他们实现的原理基本是一致的,但是在细节上,肯定差别很大。比如针对同一种语句,有的会告警,有的不会。有些支持扩展特性。有些不支持。
㈡ linux 下的gcc和windows 下的gcc相同吗gcc的源代码是否相同对同一程序编译出来的可执行文件是否相同
linux下的gcc 和 windows下的gcc,是GNU针对两个不同的平台发行的,两个不同版本的编译器,源代码不完全相同,但大部分地方是相同跨平台的代码。只需要用的时候,configure成相应的平台,它就会编译成相应平台用的gcc。
对于同一个程序,在两个不同的平台下编译出来的可执行文件是不相同的,linux下编译好的helloWorld程序在windows上面是不能运行的。
但是,linux下编译好的helloworld在linux下运行,与windows下编译好的helloworld在windows里运行的效果,是相同的。
㈢ 编译环境与生产环境gcc版本不一致是否会有问题
有一些abi兼容性问题,如果你的程序有静态或动态链接不全支持c++11的libc的话。
如果你的程序完全是用gcc 4.84编译链接出来,也没有动态链接低版本的libc的话应该没有问题
㈣ 关于gcc编译选项选取动态库不同版本的问题
不同版本的动态库是为了升级方便,旧的程序需要与旧的库链接,新的程序与新的.
一般的做法是把libabc.so连接(symbolic link, ln -s libabc.so.N libabc.so)到最新的版本,这样以后的新程序,在用gcc -labc的时候,都会链接到新的版本.旧的已经链接好的程序并不会产生不兼容的问题,因为旧程序在过去已经链接过了(动态库链接的信息可以用ldd来查看: ldd /bin/ls).
symbolic link, ln是推荐的维护版本的办法,不建议更改文件名.
如果你要有一个方便的办法链接旧的版本, 建一个旧的版本的symbolic link就可以了,libabc11.so
ln -s libabc.so.11 libabc11.so
gcc -labc11...
㈤ Linux 下查看 gcc 版本:gcc -v 和rpm -q gcc 区别
gcc -v是查看系统目前使用的gcc版本。
rpm -q gcc是Redhat/CentOS/Fedora/SuSE查看系统中是否安装了gcc rpm包。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
㈥ 关于ARM arm-linux-gcc编译器的疑问
首先编译器的选择跟处理器相关,所以arm的处理器一般只能采用arm相关的编译器。所以严格上来讲,根据所采用的ARM芯片的不同而采用不同版本的编译器也是对的,而且也建议这样做。但是编译器一般是向下兼容的,如果你的程序简单,你用了老版本的编译器编译,当然也可以在新处理器下运行咯,我记得我用gcc编译的程序,也可以在atmel9260的板子上运行呢。
㈦ Linux下的gcc编译后生成Linux下的可执行文件,window下gcc编译后是exe文件,为什么不一样啊是怎么做到的
首先,这win和Linux下的gcc功能是一样的,实际的gcc.exe和linux下的gcc这两个文件不是一样的,他们毕竟需要在工作在不同的平台上,而且他们做的一些工作是有区别的。
编译过程是把源文件翻译成机器码,然后链接成一个整体,拼接成一个文件。不管是win下的exe还是Linux下的ELF,都是按照一定规范来的,比如头部放什么,尾部放什么,中间又存哪些信息等。但是,如果要编译出正确的可执行的文件,不同的操作系统里就必须按照不同的规范来组织这个文件。
这些文件的执行过程,并不是说它们可以直接执行,执行的时候,系统把它们从磁盘上,读到内存中,经过一系列的前期工作,才可以最终执行起来,这个前期过程都是操作系统来搞定的。
你不应该问gcc是怎么做到的,而应该问gcc为什么需要这样。如果你需要知道细节,去看《程序员的自我修养》
㈧ linux编译器(如gcc)与windows编译器(vc6.0)有什么区别求详细的解答,和例证!
你好!编译器(在windows下,javac.exe)将源代码(java文件)编译为字节码(bytecode),存放在class文件中。
字节码不能直接在机器上执行,而是通过虚拟机(windows下是java.exe)执行。具体的执行方式有两种:
1. 一般情况下解释执行。解释执行并不是“解释为用c++语言写成的程序”,而是jvm把字节码看成脚本,根据字节码中的指令,由JVM去调用实际的本地方法。
2. 在打开了JIT参数的前提下,jvm会把执行过程中发现的热点位置,由jvm内部的即时编译器编译为本地机器码直接执行。
编译器将java文件编译为class文件,解释器将class文件变为机器语言
㈨ 在一个ubuntu系统中 对不同软件设置不同的gcc 版本
gcc是编译器,一般用于编译工程时可以在makefile之类的工程文件中指定不同的版本。
你运行虚拟机需要用到gcc?
㈩ 用不同版本GCC编译出的库只能用对应的GCC使用吗
不同版本的动态库是为了升级方便,旧的程序需要与旧的库链接,新的程序与新的.
一般的做法是把libabc.so连接(symbolic link, ln -s libabc.so.N libabc.so)到最新的版本,这样以后的新程序,在用gcc -labc的时候,都会链接到新的版本.旧的已经链接好的程序并不会产生不兼容的问题,因为旧程序在过去已经链接过了(动态库链接的信息可以用ldd来查看: ldd /bin/ls).
symbolic link, ln是推荐的维护版本的办法,不建议更改文件名.
如果你要有一个方便的办法链接旧的版本, 建一个旧的版本的symbolic link就可以了,libabc11.so
ln -s libabc.so.11 libabc11.so
gcc -labc11...