gcc编译器学习

gcc编译器学习
gcc编译器学习

gcc编译器学习

gcc and g++分别是gnu的c&c++编译器

gcc/g++在执行编译工作的时候,总共需要4步

1.预处理,生成.i的文件[预处理器cpp]

2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]

3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]

4.连接目标代码,生成可执行程序[链接器ld]

开始.

首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个

著名的第一个C程序开始。

#include stdio.h int main(){printf("Hello World!\n");}把这个文

件保存为game.c。你可以在命令行下编译它:gcc game.c在默认情况下,C编

译器将生成一个名为a.out的可执行文件。你可以键入如下命令运行它:a.out Hello World每一次编译程序时,新的a.out将覆盖原来的程序。你无法知道

是哪个程序创建了a.out。我们可以通过使用-o编译选项,告诉gcc我们想把

可执行文件叫什么名字。我们将把这个程序叫做game,我们可以使用任何名字,因为C没有Java那样的命名限制。gcc-o game game.c game Hello World到

现在为止,我们离一个有用的程序还差得很远。如果你觉得沮丧,你可以想一

想我们已经编译并运行了一个程序。因为我们将一点一点为这个程序添加功能,所以我们必须保证让它能够运行。似乎每个刚开始学编程的程序员都想一下子

编一个1000行的程序,然后一次修改所有的错误。没有人,我是说没有人,能做到这个。你应该先编一个可以运行的小程序,修改它,然后再次让它运行。

这可以限制你一次修改的错误数量。另外,你知道刚才做了哪些修改使程序无

法运行,因此你知道应该把注意力放在哪里。这可以防止这样的情况出现:你

认为你编写的东西应该能够工作,它也能通过编译,但它就是不能运行。请切

记,能够通过编译的程序并不意味着它是正确的。下一步为我们的游戏编写一

个头文件。头文件把数据类型和函数声明集中到了一处。这可以保证数据结构

定义的一致性,以便程序的每一部分都能以同样的方式看待一切事情。

#ifndef DECK_H#define DECK_H#define DECKSIZE 52 typedef struct deck_t{int card[DECKSIZE];int dealt;}deck_t;#endif把这个文件保存

为deck.h。只能编译.c文件,所以我们必须修改game.c。在game.c的第2行,写上#include"deck.h"。在第5行写上deck_t deck;。为了保证我们没有搞错,把它重新编译一次。gcc-o game game.c

如果没有错误,就没有问题。如果编译不能通过,那么就修改它直到能通

过为止。

预编译

编译器是怎么知道deck_t类型是什么的呢?因为在预编译期间,它实际上把"deck.h"文件复制到了"game.c"文件中。源代码中的预编译指示以"#"为前缀。你可以通过在gcc后加上-E选项来调用预编译器。

gcc-E-o game_precompile.txt game.c wc-l game_precompile.txt3199 game_precompile.txt几乎有3200行的输出!其中大多数来自stdio.h包含文件,但是如果你查看这个文件的话,我们的声明也在那里。如果你不用-o选项

指定输出文件名的话,它就输出到控制台。预编译过程通过完成三个主要任务

给了代码很大的灵活性。把"include"的文件拷贝到要编译的源文件中。用实际值替代"define"的文本。在调用宏的地方进行宏替换。这就使你能够在整个源

文件中使用符号常量(即用DECKSIZE表示一付牌中的纸牌数量),而符号常量是在一个地方定义的,如果它的值发生了变化,所有使用符号常量的地方都能自

动更新。在实践中,你几乎不需要单独使用-E选项,而是让它把输出传送给编

译器。

编译

作为一个中间步骤,gcc把你的代码翻译成汇编语言。它一定要这样做,

它必须通过分析你的代码搞清楚你究竟想要做什么。如果你犯了语法错误,它

就会告诉你,这样编译就失败了。人们有时会把这一步误解为整个过程。但是,实际上还有许多工作要gcc去做呢。

汇编

as把汇编语言代码转换为目标代码。事实上目标代码并不能在CPU上运行,但它离完成已经很近了。编译器选项-c把.c文件转换为以.o为扩展名的目标

文件。如果我们运行

gcc-c game.c我们就自动创建了一个名为game.o的文件。这里我们碰到

了一个重要的问题。我们可以用任意一个.c文件创建一个目标文件。正如我们

在下面所看到的,在连接步骤中我们可以把这些目标文件组合成可执行文件。

让我们继续介绍我们的例子。因为我们正在编写一个纸牌游戏,我们已经把一

付牌定义为deck_t,我们将编写一个洗牌函数。这个函数接受一个指向deck

类型的指针,并把一付随机的牌装入deck类型。它使用'drawn'数组跟踪记录

那些牌已经用过了。这个具有DECKSIZE个元素的数组可以防止我们重复使用一张牌。

#include stdlib.h#include stdio.h#include

time.h#include"deck.h"static time_t seed=0;void

shuffle(deck_t*pdeck){int drawn[DECKSIZE]={0};int i;

if(0==seed){seed=time(NULL);srand(seed);}for(i=0;i DECKSIZE;

i++){int value=-1;do{value=rand()%DECKSIZE;}while(drawn[value]!=0);drawn[value]=1;printf("%i\n",value);pdeck-card[i]=value;}pdeck-

dealt=0;return;}把这个文件保存为shuffle.c。我们在这个代码中加入了

一条调试语句,以便运行时,能输出所产生的牌号。这并没有为我们的程序添

加功能,但是现在到了关键时刻,我们看看究竟发生了什么。因为我们的游戏

还在初级阶段,我们没有别的办法确定我们的函数是否实现了我们要求的功能。使用那条printf语句,我们就能准确地知道现在究竟发生了什么,以便在开始下一阶段之前我们知道牌已经洗好了。在我们对它的工作感到满意之后,我们

可以把那一行语句从代码中删掉。这种调试程序的技术看起来很粗糙,但它使

用最少的语句完成了调试任务。以后我们再介绍更复杂的调试器。

请注意两个问题。

我们用传址方式传递参数,你可以从'&'(取地址)操作符看出来。这把变量的机器地址传递给了函数,因此函数自己就能改变变量的值。也可以使用全局

变量编写程序,但是应该尽量少使用全局变量。指针是C的一个重要组成部分,你应该充分地理解它。我们在一个新的.c文件中使用函数调用。操作系统总是

寻找名为'main'的函数,并从那里开始执行。shuffle.c中没有'main'函数,

因此不能编译为独立的可执行文件。我们必须把它与另一个具有'main'函数并

调用'shuffle'的程序组合起来。运行命令

gcc-c shuffle.c并确定它创建了一个名为shuffle.o的新文件。编辑game.c文件,在第7行,在deck_t类型的变量deck声明之后,加上下面这一行:

shuffle(&deck);现在,如果我们还象以前一样创建可执行文件,我们就

会得到一个错误

gcc-o game game.c/tmp/ccmiHnJX.o:In function`main':

/tmp/ccmiHnJX.o(.text+0xf):undefined reference to`shuffle'collect2:

ld returned 1exit status译成功了,因为我们的语法是正确的。但是连接步

骤却失败了,因为我们没有告诉编译器'shuffle'函数在哪里。那么,到底什么是连接?我们怎样告诉编译器到哪里寻找这个函数呢?连接

连接器ld,使用下面的命令,接受前面由as创建的目标文件并把它转换

为可执行文件

gcc-o game game.o shuffle.o这将把两个目标文件组合起来并创建可执

行文件game。

连接器从shuffle.o目标文件中找到shuffle函数,并把它包括进可执行

文件。目标文件的真正好处在于,如果我们想再次使用那个函数,我们所要做

的就是包含"deck.h"文件并把shuffle.o目标文件连接到新的可执行文件中。

象这样的代码重用是经常发生的。虽然我们并没有编写前面作为调试语句

调用的printf函数,连接器却能从我们用#include stdlib.h语句包含的文件

中找到它的声明,并把存储在C库(/lib/libc.so.6)中的目标代码连接进来。

这种方式使我们可以使用已能正确工作的其他人的函数,只关心我们所要解决

的问题。这就是为什么头文件中一般只含有数据和函数声明,而没有函数体。

一般,你可以为连接器创建目标文件或函数库,以便连接进可执行文件。我们

的代码可能产生问题,因为在头文件中我们没有放入任何函数声明。为了确保

一切顺利,我们还能做什么呢?

另外两个重要选项

-Wall选项可以打开所有类型的语法警告,以便帮助我们确定代码是正确的,并且尽可能实现可移植性。当我们使用这个选项编译我们的代码时,我们

将看到下述警告:

game.c:9:warning:implicit declaration of function`shuffle'这让我们知道还有一些工作要做。我们需要在头文件中加入一行代码,以便告诉编

译器有关shuffle函数的一切,让它可以做必要的检查。听起来象是一种狡辩,但这样做可以把函数的定义与实现分离开来,使我们能在任何地方使用我们的

函数,只要包含新的头文件并把它连接到我们的目标文件中就可以了。下面我

们就把这一行加入deck.h中。

void shuffle(deck_t*pdeck);这就可以消除那个警告信息了。

另一个常用编译器选项是优化选项-O#(即-O2)。这是告诉编译器你需要什

么级别的优化。编译器具有一整套技巧可以使你的代码运行得更快一点。对于

象我们这种小程序,你可能注意不到差别,但对于大型程序来说,它可以大幅

度提高运行速度。你会经常碰到它,所以你应该知道它的意思。

调试

我们都知道,代码通过了编译并不意味着它按我们得要求工作了。你可以

使用下面的命令验证是否所有的号码都被使用了

game|sort-n|less并且检查有没有遗漏。如果有问题我们该怎么办?我们

如何才能深入底层查找错误呢?

你可以使用调试器检查你的代码。大多数发行版都提供著名的调试器:gdb。如果那些众多的命令行选项让你感到无所适从,那么你可以使用KDE提供的一

个很好的前端工具KDbg。还有一些其它的前端工具,它们都很相似。要开始调试,你可以选择File-Executable然后找到你的game程序。当你按下F5键或

选择Execution-从菜单运行时,你可以在另一个窗口中看到输出。怎么回事?

在那个窗口中我们什么也看不到。不要担心,KDbg没有出问题。问题在于我们

在可执行文件中没有加入任何调试信息,所以KDbg不能告诉我们内部发生了什么。编译器选项-g可以把必要的调试信息加入目标文件。你必须用这个选项编

译目标文件(扩展名为.o),所以命令行成了:

gcc-g-c shuffle.c game.c gcc-g-o game game.o shuffle.o这就把钩子

放入了可执行文件,使gdb和KDbg能指出运行情况。调试是一种很重要的技术,很值得你花时间学习如何使用。调试器帮助程序员的方法是它能在源代码中设置"断点"。现在你可以用右键单击调用shuffle函数的那行代码,试着设置断点。那一行边上会出现一个红色的小圆圈。现在当你按下F5键时,程序就会在那一行停止执行。按F8可以跳入shuffle函数。呵,我们现在可以看到shuffle.c中的代码了!我们可以控制程序一步一步地执行,并看到究竟发生

了什么事。如果你把光标暂停在局部变量上,你将能看到变量的内容。太好了。这比那条printf语句好多了,是不是?

小结

本文大体介绍了编译和调试C程序的方法。我们讨论了编译器走过的步骤,以及为了让编译器做这些工作应该给gcc传递哪些选项。我们简述了有关连接

共享函数库的问题,最后介绍了调试器。真正了解你所从事的工作还需要付出

许多努力,但我希望本文能让你正确地起步。你可以在gcc、as和ld的man和info page中找到更多的信息。

自己编写代码可以让你学到更多的东西。作为练习你可以以本文的纸牌游

戏为基础,编写一个21点游戏。那时你可以学学如何使用调试器。使用GUI的KDbg开始可以更容易一些。如果你每次只加入一点点功能,那么很快就能完成。切记,一定要保持程序一直能运行!

要想编写一个完整的游戏,你需要下面这些内容:

一个纸牌玩家的定义(即,你可以把deck_t定义为player_t)。一个给指

定玩家发一定数量牌的函数。记住在纸牌中要增加"已发牌"的数量,以便能知

道还有那些牌可发。还要记住玩家手中还有多少牌。一些与用户的交互,问问

玩家是否还要另一张牌。一个能打印玩家手中的牌的函数。card等于

value%13(得数为0到12),suit等于value/13(得数为0到3)。一个能确定玩家手中的value的函数。Ace的value为零并且可以等于1或11。King的

value为12并且可以等于10。GCC编译选项解析

GCC是Linux下基于命令行的C语言编译器,其基本的使用语法如下。

gcc[option|filename]…

对于编译C++的源程序,其基本语法如下:

g++[option|filename]…

其中option为GCC使用时的选项,而filename为需要GCC做编译的处理

的的文件名。就GCC来说,其本身是一个十分复杂的的命令,合理的使用其命

令选项可以有效地提高程序的编译效率、优化代码,GCC拥有众多的命令选项,有超过100个的编译选项可用,按其应有如下的分类。

常用编译选项

-c选项:这是GCC命令的常用选项。-c选项告诉GCC仅把源程序编译为目标代码而不做链接工作,所以采用该选项的编译指令不会生成最终的可执行程序,而是生成一个与源程序文件名相同的以.o为后缀的目标文件。例如一个Test.c的源程序经过下面的编译之后会生成一个Test.o文件#gcc– cTest.h

-S选项:使用该选项会生成一个后缀名为.s的汇编语言文件,但是同样不会生成可执行程序。-e选项:-e选项只对文件进行预处理,预处理的输出结果被送到标准输出(比如显示器)。-v选项:在Shell的提示符号下键入gcc– v,屏幕上就会显示出目前正在使用的gcc版本的信息.-x language:强制编译器

指定的语言编译器来编译某个源程序。例如下面的指令:

#gcc-x c++p1.c

该指令表示强制采用C++编译器来编译C程序P1.c。

-I DIR选项:库依赖选项,指定库及头文件路径。在Linux下开发程序的

时候,统常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。

一般情况下,Linux下的大多数函数都将头文件放到系统/usr/include目录下,而库文件则放到/usr/lib目录下。但在有些情况下并不是这样的,在这些情况下,使用GCC编译时必须指定所需要的头文件和库文件所在的路径。-I选项可

以向GCC的头文件搜索路径中添加新的目录DIR。例如,一个源程序所依赖的

头文件在用户/home/include/目录下,此时就应该使用-I选项来指定。

#gcc– I/home/include-o test test.c

-L DIR:类似于上面的情况,用来特别指定所依赖库所在的路径如果使用

不在标准位置的库,那么可以通过-L选项向GCC的库文件搜索路径中添加新的

目录。例如,一个程序要用到的库libapp.so在/home/zxq/lib/目录下,为了

能让GCC能够顺利地链接该库,可以使用下面的指令:

#gcc-Test.c-L/home/zxq/lib/-lapp– oTest

这里的-L选项表示GCC去链接库文件libapp.so。在Linux下的库文件在

命名时遵循了一个约定,那就是应该以lib三个字母开头,由于所有的库文件

都遵循了同样的规范,因此在使用-L选项指定链接的库文件名时可以省去lib

三个字母,也就是说GCC在对-lapp进行处理的时候,会自动去链接名为libapp.so的文件

-static选项:GCC在默认情况下链接的是动态库,有时为了把一些函数静态编译到程序中,而无需链接动态库就采用-static选项,它会强制程序连接

静态库。-o选项:在默认的状态下,如果GCC指令没有指定编译选项的情况下

会在当前目录下生成一个名为a.out的可执行程序,例如:执行#gcc Test.c

命令后会生成一个名为a.out的可执行程序。因此,为了指定生成的可执行程

序的文件名,就可以采用-o选项,比如下名的指令:#gcc– oTest Test.c

执行该指令会在当前目录下生成一个名为Test的可执行文件。

出错检查和警告提示选项GCC编译器包含完整的出错检查和警告提示功能,比如GCC提供了30多条警示信息和3个警告级别,使用这些选项有助于增强程序的稳定性和更加完善程序代码的设计,此类选项常用的如下。

-pedantic以ANSI/ISO C标准列出的所有警告当GCC在编译不符合

ANSI/ISO C语言标准的源代码时,如果在编译指令中加上了-pedantic选项,

那么源程序中使用了扩展语法的地方将产生相应的警告信息。

-w禁止输出警告信息-Werror将所有警告转换为错误Werror选项要求GCC

将所有的警告当成错误进行处理,这在使用自动编译工具(如Make等)时非常有用。如果编译时带上-Werror选项,那么GCC会在所有产生警告的地方停止编译,只有程序员对源代码进行修改并起相应的警告信息消除时,才能够继续完

成后续的编译工作。

-Wall显示所有的警告信息-Wall选项可以打开所有类型的语法警告,以便于确定程序源代码是否是正确的,并且尽可能实现可移植性。

对Linux开发人员来讲,GCC给出的警告信息是很有价值的,它们不仅可

以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具。建

议在用GCC编译源代码时始终带上-Wall选项,养成良好的习惯。

代码优化选项代码优化是指编译器通过分析源代码找出其中尚未达到最优

的部分,然后对其重新进行组合,进而改善代码的执行性能。GCC通过提供编

译选项-On来控制优化代码的生成,对于大型程序来说,使用代码优化选项可

以大幅度提高代码的运行速度。

-O选项:编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。-O2选项:选项-O2告诉GCC除了完成所有-O1级别的优化

之外,同时还要进行一些额外的调整工作,如处理器指令调度调试分析选项

-g选项:生成调试信息,GNU调试器可以利用该信息。GCC编译器使用该

选项进行编译时,将调试信息加入到目标文件中,这样gdb调试器就可以根据

这些调试信息来跟中程序的执行状态。-pg选项:编译完成后,额外产生一个

性能分析所需信息。

注意:使用调试选项都会使最终生成的二进制文件的大小急剧增加,同时增加程序在执行时

的开销,因此调试选项统常推荐仅仅在程序开发和调试阶段中使用。

下面举一个简单的例子来说明GCC的编译过程。首先用vi编辑器来编辑一个简单的c程序test.c,程序清单如下。

#include stdio.h int main()

{

printf("Hello,this is atest!\n");

return 0;

}

根据上面的内容,使用gcc命令来编译该程序。

[root@localhost]#gcc– otest test.c

[root@localhost]#./test Hello,this is atest!

可以从上面的编译过程看到,编译一个这样的程序非常简单,一条指令即可完成,事实上,这条指令掩盖了很多细节。我们可以从编译器的角度来看上述编译过程,这对于更好理解GCC编译工作原理有很好的帮助。

GCC编译器首先做的工作是预处理:调用-E参数可以让GCC在预处理结束后停止编译过程。

#gcc– Etest.c-o test.i

编译器在这一步调用cpp工具来对源程序进行预处理,此时会生成test.i 文件,下面部分列出了test.i文件中的内容。

MSN空间完美搬家到新浪博客!

特别声明:

1:资料来源于互联网,版权归属原作者

2:资料内容属于网络意见,与本账号立场无关3:如有侵权,请告知,立即删除。

gcc编译器使用简明指南

gcc编译器使用简明指南 gcc对文件的处理需要经过预处理->编译->汇编->链接的步骤,从而产生一个可执行文件,各部分对应不同的文件类型,具体如下: file.c c程序源文件 file.i c程序预处理后文件 file.cxx c++程序源文件,也可以是https://www.360docs.net/doc/e513914605.html, / file.cpp / file.c++ file.ii c++程序预处理后文件 file.h c/c++头文件 file.s 汇编程序文件 file.o 目标代码文件 gcc [选项]文件列表 -ansi 强制完全ANSI一致 -c 仅编译或汇编,生成目标代码文件,将.c、.i、.s等文件生成.o文件,其余文件被忽略 -S 仅编译,不进行汇编和链接,将.c、.i等文件生成.s文件,其余文件被忽略 -E 仅预处理,并发送预处理后的.i文件到标准输出,其余文件被忽略 -o file 创建可执行文件并保存在file中,而不是默认文件a.out -g 产生用于调试和排错的扩展符号表,用于GDB调试,切记-g和-O通常不能一起使用 -w 取消所有警告 -W 给出更详细的警告 -O [num]优化,可以指定0-3作为优化级别,级别0表示没有优化 -x language 默认为-x none,即依靠后缀名确定文件类型,加上-x lan确定后面所有文件类型,直到下一个-x出现为止 -D macro[=]类似于源程序里的#define,在-D macro中的macro可被源程序识别,例如gcc -D NUM -D FILE=\"bbs.txt\" hello.c -o hello,第一个-D选项定义宏NUM,在程序中可以使用#ifdef来检查是否被设置,第二个-D定义宏FILE,在源程序中可用 -U macro 类似于源程序开头定义#undef macro,也就是取消源程序中的某个宏定义

gcc编译器的下载和安装教程_华清远见

gcc编译器的下载和安装教程 今天分享的教程是gcc编译器的下载和安装教程,大家可以跟着教程一起来实现他! Linux下变成的源码要运行,必须先转成二进制的机器码。此时就需要编译器,Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。 Gcc编译器能将C、C++语言源程序通过编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。 比如,下面这段源码(文件名叫做test.c)。 #include int main(void) { printf("Hello, world!\n"); return 0; } 编译则使用gcc命令,gcc命令提供了非常多的命令选项。 一. 常用编译命令选项 假设源程序文件名为test.c。 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out,如果需要执行,内核中必须支持该文件的格式,默认一般都是elf可执行程序 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。 3. 选项 -E

用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件,预处理其实就是处理#预处理符号,比如#include, #define, #if, #ifdef, #error等 4. 选项 -S 用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。汇编语言对应汇编指令,默认gcc编译成x86指令,如果需要编译arm架构的,就必须使用交叉工具链 5. 选项 -c 用法:#gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件,二进制文件就是101010机器码 6. 无选项链接 用法:#gcc test.o -o test 作用:将编译输出文件test.o链接成最终可执行文件test。 如果需要修改Ubuntu的gcc版本,可以看一下你的Ubuntu安装了哪些版本的gcc 用命令:ls /usr/bin/gcc* -l 显示是 lrwxrwxrwx 1 root root 7 2017-08-14 15:17 /usr/bin/gcc -> gcc-4.6 -rwxr-xr-x 1 root root 302104 2017-09-17 05:43 /usr/bin/gcc-4.6 由上面显示可以看出默认安装的是gcc-4.6,现在来改成gcc-4.7 $ sudo apt-get install gcc-4.7 $ sudo apt-get install g++-4.7 删除gcc-4.6的软连接文件/usr/bin/gcc。(只是删除软连接) 命令:sudo rm /usr/bin/gcc 然后建一个软连接,指向gcc-4.7。 命令:sudo ln -s /usr/bin/gcc-4.7 /usr/bin/gcc 然后可以通过命令:gcc -v 查看版本

gcc语言编译原理_CompilingBinaryFilesUsingACompiler

Making plain binary?les using a C compiler(i386+) Cornelis Frank April10,2000 I wrote this article because there isn’t much information on the Internet concerning this topic and I needed this for the EduOS project. No liability is assumed for incidental or consequential damages in connection with or arising out of use of the information or programs contained herein. So if you blow up your computer because of my bad“English”that’s your problem not mine. 1Which tools do you need? An i386PC or higher. A Linux distribution like Red Hat or Slackware. GNU GCC compiler.This C compiler usually comes with Linux.To check if you’re having GCC type the following at the prompt: gcc--version This should give an output like: 2.7.2.3 The number probably will not match the above one,but that doesn’t really matter. The binutils for Linux. NASM Version0.97or higher.The Netwide Assembler,NASM,is an80x86assembler designed for portability and modularity.It supports a range of object?le formats,including Linux‘a.out’and ELF,NetBSD/FreeBSD,COFF,Microsoft16-bit OBJ and Win32.It will also output plain binary?les.Its syntax is designed to be simple and easy to understand, similar to Intel’s but less complex.It supports Pentium,P6and MMX opcodes,and has macro capability. Normally you don’t have NASM on your system.Download it from: https://www.360docs.net/doc/e513914605.html,/pub/Linux/devel/lang/assemblers/ A text editor like pico or emacs.

gcc命令行详解

gcc命令行详解 1、gcc包含的c/c++编译器 gcc、cc、c++、g++ gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为test的程序 -o参数用来指定生成程序的名字 3、为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm 4、-l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?-lname,在连接时,装载名字为“libname.a”的函数库:-lm表示连接名为“libm.a”的数学函数库。就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件) 放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是 -L/aaa/bbb/ccc -ltest 另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.s o.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so, 如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx 库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了 ln -s libxxxx-x.x.x.so libxxxx.so 手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如 gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"- L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic

1、GCC编译器的使用

linux下gcc编译器的使用 1、文件后缀名 .c C 源程序 .C C++ 源程序 .cc C++ 源程序 .cxx C++ 源程序 .m Objective –C源程序 .i 预处理过的c源程序 .ii 预处理过的C++源程序 .s 组合语言源程序 .S 组合语言源程序 .h 头文件 .o 目标文件 .a 存档文件 2、GCC常用选项 -c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件; -Dmacro定义指定的宏,使它能够通过源码中的#ifdef进行检验 #define -static 指定程序编译时采用静态编译的方法; -E 不经过编译预处理程序的输出而输送至标准输出; -g获得有关调试程序的详细信息,它不能与-o选项联合使用; -Idirectory在包含文件搜索路径的起点处添加指定目录; -llibrary提示链接程序在创建最终可执行文件时包含指定的库; -O、-O2、-O3将优化状态打开,该选项不能与-g选项联合使用; -S要求编译程序生成来自源代码的汇编程序输出; -v启动所有警报; -Wall发生警报时取消编译操作,即将警报看作是错误; -Werror在发生警报时取消编译操作,即把报警当作是错误; -w 禁止所有的报警。 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。

linux 编译器gcc

1.8 Linux 上的C/C++ 编译器和调试器 https://www.360docs.net/doc/e513914605.html,/man/linux_tsinghua/compiler.html ?运行 gcc/egcs ?gcc/egcs 的主要选项 ?gdb ?gdb 的常用命令 ?gdb 使用范例 ?其他程序/库工具 (ar, objdump, nm, size, strings, strip, ...) 1.8.1 运行 gcc/egcs Linux 中最重要的软件开发工具是 GCC。GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。 #DEMO#: hello.c 如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可执行文件。例如,假设你有 两个源文件 main.c 和 factorial.c 两个源文件,现在要编译生成一个计算阶乘的程序。 清单 factorial.c ----------------------- #include #include int factorial (int n) { if (n <= 1) return 1; else return factorial (n - 1) * n; } ----------------------- ----------------------- 清单 main.c ----------------------- #include #include

实验三 vi编辑器及GCC编译器的使用

实验三vi编辑器及GCC编译器的使用 【实验目的】 一、掌握文本编辑器vi的使用方法 二、了解GNU gcc编译器 三、掌握使用GCC编译C语言程序的方法 【实验内容】 一、vi的三种工作模式: 1、命令模式: 执行相关文本编辑命令 2、输入模式: 输入文本 3、末行模式: 实现查找、替换、保存、多文件操作等等功能 二、进入vi,直接在Shell提示符下键入vi [文件名称],如果该文件在当前目录不存在,则vi创建之。 三、退出vi 1、在命令模式下输入“: wq”,保存文件并退出vi 2、若不需要保存文件,输入“: q” 3、若文件已修改,但不保存,输入“:

q!”强制退出vi 4、其它一些不常用的方法在此省略。 四、命令模式下的常用编辑命令 1、启动vi后,进入的是vi的命令模式 2、按i键,进入输入模式,可以进行文本的编辑,在输入模式下,按esc 键,可切换回命令模式 i: 光标位置不变,可在光标左侧插入正文 a: 光标位置向后退一格,可在光标左侧插入正文 o: 在光标所在行的下一行增添新行 O: 在光标所在行的上一行增添新行 I: 光标跳到当前行的开头 A: 光标跳到当前行的末尾 3、光标的移动 k、j、h、l分别等同于上、下、左、右箭头键 Ctrl+b,向上翻一页

Ctrl+f,向下翻一页 nH,将光标移到屏幕的第n行 nL,将光标移到屏幕的倒数第n行 4、删除文本 nX,删除光标所指向的后n个字符 D,删除光标右侧的所有字符(包括光标所指向的字符)db,删除光标左侧的全部字符 ndd,删除当前行和当前行以后的n行内容 5、粘贴和复制 p,将缓冲区的内容粘贴到当前字符的右侧 P,将缓冲区的内容粘贴到当前字符的左侧 yy,复制当前行到内存缓冲区 nyy,复制n行内容到内存缓冲区 6、搜索字符串 /str1,正向搜索字符串str1 n,继续搜索 ?str2,反向搜索字符串str2 7、撤销和重复 u,撤销前一条命令的执行结果 .,重复最后一条命令

linux系统下C编译器GCC入门

linux系统下C编译器— gcc 入门 <一>gcc简介 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为 a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。 .c为后缀的文件,C语言源代码文件; .a为后缀的文件,是由目标文件构成的档案库文件; .C,.cc或.cxx 为后缀的文件,是C++源代码文件; .h为后缀的文件,是程序所包含的头文件; .i 为后缀的文件,是已经预处理过的C源代码文件; .ii为后缀的文件,是已经预处理过的C++源代码文件; .m为后缀的文件,是Objective-C源代码文件; .o为后缀的文件,是编译后的目标文件; .s为后缀的文件,是汇编语言源代码文件; .S为后缀的文件,是经过预编译的汇编语言源代码文件。 <二>gcc的执行过程 虽然我们称gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,. S为后缀的汇编语言源代码文件和汇编,.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。 <三>gcc的基本用法和选项 在使用gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。g cc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。

《Linux操作系统》实验十-UNIX gcc编译器的使用与编程环境

《Linux操作系统》 实验报告 实验十:UNIX gcc编译器的使 用与编程环境

一、实验目的 (1)掌握gcc和g++的用法; (2)了解目标代码、库函数的使用; (3)掌握静态库和共享库的构造与使用; (4)掌握多模块和多语言联合开发方法; (5)掌握make命令和Makefile文件的使用。 二、实验环境 一台装有Windows操作系统PC机,上装有虚拟机系统VMWare,实验过程通过VMWare系统启Linux系统工作。 三、实验内容与实验过程及分析 一、C/C++编程 1、C语言版“Hello World” 用vi编辑一个名为hello.c的文件,其内容为 #include main() { printf(”Hello World! C\n”); } 编译并执行程序。 编译方法为: cc hello.c // 生成可执行程序 a.out cc –o hello hello.c // 生成可执行程序hello cc –c hello.c //生成目标文件hello.o cc –S hello.c //生成汇编语言程序hello.s 执行程序: ./a.out #执行当前目录内,刚编译生成的a.out程序 ./hello #执行当前目录内,刚编译生成的hello程序

2、组合编程 设有C语言文件f1.c,内容为: #include f1(int arg){ printf(”f1: you passed %d\n”,arg); } C语言文件f2.c。内容为: #include f2(char *arg){ printf(”f2: you passed %s\n”,arg); } C语言文件m.c。内容为: #include main(){ f1(16); f2(”Hello World!”); } 请使用vi编辑并生成以上程序,分别用以下方法编译,观察生成文件或运行生成的可执行程序: cc –c f1.c f2.c #生成 f1.o 和 f2.o cc –S f1.c f2.c # 生成 f1.s 和 f2.s;可用vi或cat查看它们的内容cc –o mp m.c f1.c f2.c # 生成mp,执行方法为:./mp cc –o m m.c f1.o f2.o # 生成m,执行方法为:./m

最新GCC编译器选项及优化提示

G C C编译器选项及优 化提示

GCC编译器选项及优化提示 GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径; 因此献上此帖,以供各位玩家参考,绝对原创噢 = 大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。 如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。 一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。 一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了! 另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure 脚本会使用这两个环境变量代替Makefile文件中的值。 但是少数configure脚本并不这样做,他们必须需要手动编辑才行。 为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值): export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS 这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行), Intel通常是: pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium- m,prescott,nocona 说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu; prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋) AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx 用AMD的一般都是DIYer,就不必解释了吧。 如果编译时没有抱怨"segmentation fault,core dumped",那么你设定的"-O"优化参数一般就没什么问题。 否则请降低优化级别("-O3"-"-O2"-"-O1"-取消)。 个人意见:服务器使用"-O2"就可以了,它是最安全的优化参数(集合);桌面可以使用"-O3"; 不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时"-O3"反而更慢)。 编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。 所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

arm-linux-gcc常用参数讲解gcc编译器使用方法 我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段: 1. 预处理(Pre-Processing) 2. 编译(Compiling) 3. 汇编(Assembling) 4. 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。 以文件example.c为例说明它的用法 0. arm-linux-gcc -o example example.c 不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。 -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出 a.out 1. arm-linux-gcc -c -o example.oexample.c -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件 去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以 2.arm-linux-gcc -S -o example.sexample.c -S参数将对源程序example.c进行预处理、编译,生成example.s文件 -o选项同上 3.arm-linux-gcc -E -o example.iexample.c -E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上) 就是将#include,#define等进行文件插入及宏扩展等操作。 4.arm-linux-gcc -v -o example example.c 加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。 5.arm-linux-gcc -g -o example example.c -g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。 6.arm-linux-gcc -Wall -o example example.c -Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变量等。 7.arm-linux-gcc -Ox -o example example.c -Ox使用优化选项,X的值为空、0、1、2、3 0为不优化,优化的目的是减少代码空间和提高执行效率等,但相应的编译过程时间将较长并占用较大的内存空间。 8.arm-linux-gcc -I /home/include -o example example.c -Idirname: 将dirname所指出的目录加入到程序头文件目录列表中。如果在预设系统及当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。 9.arm-linux-gcc -L /home/lib -o example example.c

gcc编译器 CFLAGS 标志参数说明

gcc编译器 CFLAGS 标志参数说明2012-11-14 15:10:28 分类:LINUX CFLAGS = -g -O2 -Wall -Werror -Wno-unused 编译出现警告性错误unused-but-set-variable,变量定义但没有使用,解决方法: 增加CFLAGS 或CPPFLAGS参数如下: CPPFLAGS=" -Werror -Wno-unused-but-set-variable" || exit 1 Gcc总体选项列表 后缀名所对应的语言 -S只是编译不汇编,生成汇编代码 -E只进行预编译,不做其他处理 -g在可执行程序中包含标准调试信息 -o file把输出文件输出到file里 -v打印出编译器内部编译各过程的命令行信息和编译器的版本 -I dir在头文件的搜索路径列表中添加dir目录 -L dir在库文件的搜索路径列表中添加dir目录 -static链接静态库 -llibrary连接名为library的库文件 ·“-I dir” 正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。由于Linux 中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。 比如在“/root/workplace/Gcc”下有两个文件: #include int main() { printf(“Hello!!\n”); return 0; } #include

这样,就可在Gcc命令行中加入“-I”选项: [root@localhost Gcc] Gcc hello1.c –I /root/workplace/Gcc/ -o hello1 这样,Gcc就能够执行出正确结果。 小知识 在include语句中,“<>”表示在标准路径中搜索头文件,““”” 表示在本目录中搜索。故在上例中,可把hello1.c的“#include” 改为“#include “my.h””,就不需要加上“-I”选项了。 ·“-L dir” 选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。 例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库 libsunq.so,则只需键入如下命令即可: [root@localhost Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq 需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在 路径中包含文件名。 另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。由于在Linux 下的库文件命名时有一个规定:必须以lib三个字母开头。因此在用-l选项指定链接的库 文件名时可以省去lib三个字母。也就是说Gcc在对”-lsunq”进行处理时,会自动去链接 名为 libsunq.so的文件。 (2)告警和出错选项 Gcc的告警和出错选项如表3.8所示。 Gcc总体选项列表 选项含义 -ansi 支持符合ANSI标准的C程序 -pedantic 允许发出ANSI C标准所列的全部警告信息 -pedantic-error 允许发出ANSI C标准所列的全部错误信息 -w 关闭所有告警 -Wall 允许发出Gcc提供的所有有用的报警信息 -werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程 下面结合实例对这几个告警和出错选项进行简单的讲解。 如有以下程序段: #include void main() { long long tmp = 1; printf(“This is a bad code!\n”);

gcc编译器使用说明

要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。然后,我们简要介绍一下编译器究竟作了那些工作,以及如何控制编译过程。我们也简要介绍了调试器的使用方法。 GCC rules 你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马。Ken Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和永久的木马。请到这里阅读他对这个杰作的描述。幸运的是,我们有了gcc。当你进行 configure; make; make install 时, gcc在幕后做了很多繁重的工作。如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。我们将看看如何编译C程序,以及如何使用编译选项让gcc按照我们的要求工作。步骤(以及所用工具)如下:预编译 (gcc -E),编译 (gcc),汇编 (as),和连接 (ld)。 开始... 首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。(各位老前辈,请原谅我)。 #include int main() { printf("Hello World!\n"); } 把这个文件保存为 game.c。你可以在命令行下编译它: gcc game.c 在默认情况下,C编译器将生成一个名为 a.out 的可执行文件。你可以键入如下命令运行它:a.out Hello World 每一次编译程序时,新的 a.out 将覆盖原来的程序。你无法知道是哪个程序创建了 a.out。

GCC编译器选项及优化提示12页word

GCC编译器选项及优化提示 GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径; 因此献上此帖,以供各位玩家参考,绝对原创噢 大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。 如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。 一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。 一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了! 另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure脚本会使用这两个环境变量代替Makefile文件中的值。 但是少数configure脚本并不这样做,他们必须需要手动编辑才行。 为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值): export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS 这是一个确保能够在几乎所有平台上都能正常工作的最小设置。 "-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行), Intel通常是: pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium- m,prescott,nocona 说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m 是迅驰I/II代笔记本的cpu; prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)

gcc入门教程

不经意间,GCC已发展到了4.3的版本,尽管在软件开发社区之外乏人闻问,但因为GCC 在几乎所有开源软件和自由软件中都会用到,因此它的编译性能的涨落会直接影响到Linux 、Firefox 乃至于https://www.360docs.net/doc/e513914605.html,和Apache等几千个项目的开发。因此,把GCC摆在开源软件的核心地位是一点也不为过。另一方面,GCC4.3的出现,正在牵引着广大程序员们的心。如果我们非要用一个词来说明GCC与程序员之间的关系,那无疑是"心随心动"。 历史篇 作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持C 语言;它现在还支持Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury 语言,等等。而GCC 也不再单只是GNU C 语言编译器的意思了,而是变成了GNU Compiler Collection 也即是GNU 编译器家族的意思了。另一方面,说到GCC 对于各种硬件平台的支持,概括起来就是一句话:无所不在。几乎所有有点实际用途的硬件平台,甚至包括有些不那么有实际用途的硬件平台。 Gcc 简介 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。Gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。 官方网站:https://www.360docs.net/doc/e513914605.html,/ gcc是linux的唯一编译器,没有gcc就没有linux,gcc的重要性就不可言喻啦。居然这么重要,那就很值得我们来好好研究下啦。好啦,开始我们的gcc之旅吧! 首先消除gcc和g++误区吧。 gcc和g++都是GNU(组织)的一个编译器。 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:#include int main(int argc, char* argv[]) { if(argv == 0) return; printString(argv); return; } int printString(char* string) { sprintf(string, "This is a test.\n"); } 如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString 未定义”; “cannot convert `char**' to `char*”;

实验二、Vi文本编辑器和GCC编译器的使用

实验二、Vi文本编辑器和GCC编译器的使用 一、实验目的: 1、掌握Linux系统终端方式使用的编辑器vi; 2、学习vi的启动、存盘、文本输入、现有文件的打开、光标移动、复制/剪贴、查找/替换等命令。 3、掌握GCC编译器的使用。 二、实验内容: 1、用Vi文本编辑器对你的计算机进行网络配置。网络配置文件有: 文件1:/etc/sysconfig/network; 文件2:/etc/sysconfig/network-scripts/ifcfg-eth0; 文件3:/etc/resolv.conf; 要求:在图形界面下配置,看相应配置文件有没有被修改;修改配置文件看图形界面是否被修改。 2、将显示器配置文件(自己查),复制到//home目录下(一定要复制,对副本进行操作,否则出现异常后果自负),并重命名为i.打开i文件,设置行标,将第89行至第96行的内容复制到第116行,并将第62行至第86行的Option替换为type.并将整篇文章中的Section替换成choose.将修改后的文件另存为j.并将j复制到/usr目录下,并重命名为k. 3、在vi中编写一个abc.c程序,对程序进行编译、连接、运行。具体如下: [student@enjoy abc]$ vi abc.c main() { int i,sum=0; for(i=0;i<=100;i++) { sum=sum+i; } printf("\n1+2+3+...+99+100=%d\n",sum);}

[student@enjoy abc]$ gcc -o abc abc.c [student@enjoy abc]$ ls abc abc.c [student@enjoy abc]$ ./abc 1+2+3+...+99+100=5050 [student@enjoy abc]$ [student@enjoy abc]$ 4、从如上内容的基础上总结vi的启动、存盘、文本输入、现有文件的打开、光标移动、复制/剪贴、查找/替换等命令。 5、编写一个程序解决“鸡兔同笼”问题。 参考程序: #include main() { int h,f; int x,y; printf("请输入头数和脚数:"); scanf("%d,%d",&h,&f); x=(4*h-f)/2; y=(f-2*h)/2; printf("鸡=%d 兔子=%d",x,y); } 运行结果: 请输入头数和脚数:18,48 鸡=12 兔子=6 注:以上实验结果抓图后,做成电子文档的实验报告发送到ftp://192.168.0.22上。

相关文档
最新文档