关闭

gcc 使用汇总

1272人阅读 评论(0) 收藏 举报
Gcclinux下面最常用的编译软件,通常用来编译C程序,但是也可以通过设置编译多种语言写成的程序。
下面简单介绍gcc常用的使用的参数。
-o 选择产生的目标文件的名称
-l 选择要使用到的链接库
-c 只编译不连接
 
例如:编译一个多线程的程序可以使用命令:
gcc –lpthread –o test test.c
即将test.c 文件编译,生成可执行文件test, -lpthread的目的是使程序在连接的时候连接pthread库从而支持多线程的程序。要是程序里面没有使用线程可以将这个选项去掉。
########################text2######################################

Linux开发应用程序大多数情况下使用的都是C言,因此几乎一位Linux程序的首要问题都是如何灵活运用C编译器。目前Linux下最常用的C编译器是GCCGNU Compiler Collection),它是GNU目中符合ANSI C准的编译,能够编译CC++Object C写的程序。GCC功能非常大,构也异常灵活。最得称道的一点就是它可以通不同的前端模来支持各种语言,如JavaFortranPascalModula-3Ada等。

放、自由和灵活是Linux的魅力所在,而一点在GCC上的体就是程序它能更好地控制整个编译过程。在使用GCC编译程序编译过程可以被四个段:
预处理(Pre-Processing
编译Compiling
汇编Assembling
接(Linking
Linux程序可以根据自己的需要GCC编译的任何束,以便检查或使用编译器在该阶段的出信息,或者最后生成的二制文件行控制,以便通加入不同数量和种类调试今后的调试做好准。和其它常用的编译器一GCC也提供了灵活而大的代码优化功能,利用它可以生成行效率更高的代
GCC提供了30多条警告信息和三个警告级别,使用它有助于增程序的定性和可移植性。此外,GCC还对标准的CC++行了大量的展,提高程序的行效率,有助于编译行代码优化,能轻编程的工作量。
GCC
在学使用GCC之前,下面的个例子能帮助用迅速理解GCC的工作原理,并将其立即运用到实际开发中去。首先用熟悉的编辑入清1所示的代
1hello.c
#include <stdio.h>
int main(void)
{
printf ("Hello world, Linux programming!/n");
return 0;
}

然后行下面的命令编译和运行段程序:
# gcc hello.c -o hello
# ./hello
Hello world, Linux programming!

从程序的角度看,只需简单行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁的工作。首先,GCC需要预处理程序cpp,由它负责在源文件中定的宏,并向其中插入“#include”句所包含的内容;接着,GCCcclas理后的源代码编译成目;最后,GCC接程序ld,把生成的目码链接成一个可行程序。
了更好地理解GCC的工作程,可以把上述编译过程分成几个步骤单行,并每步的运行果。第一预编译,使用-E参数可以GCC预处束后停止编译过程:
# gcc -E hello.c -o hello.i

hello.cpp文件中的内容,会发现stdio.h的内容确都插到文件里去了,而其它当被预处理的宏定也都做了相理。下一是将hello.i编译为可以通使用-c参数来完成:
# gcc -c hello.i -o hello.o

GCC
.i文件看成是预处理后的C言源代,因此上述命令将自过预处步骤编译过程,也可以使用-x参数GCC从指定的步骤开编译。最后一是将生成的目文件接成可行文件:
# gcc hello.o -o hello

在采用模化的设计思想开发时,通常整个程序是由多个源文件成的,相地也就形成了多个编译单元,使用GCC很好地管理编译单元。假有一个由foo1.cfoo2.c两个源文件成的程序,们进编译,并最生成可行程序foo,可以使用下面条命令:
# gcc foo1.c foo2.c -o foo

如果同时处理的文件不止一个,GCC仍然会按照预处理、编译接的程依次行。如果深究起来,上面条命令大致相当于依次行如下三条命令:
# gcc -c foo1.c -o foo1.o
# gcc -c foo2.c -o foo2.o
# gcc foo1.o foo2.o -o foo

编译一个包含多源文件的工程,若只用一条GCC命令来完成编译是非常浪费时间的。假设项目中有100个源文件需要编译,并且个源文件中都包含10000行代,如果像上面那样仅用一条GCC命令来完成编译工作,那GCC需要将个源文件都重新编译一遍,然后再全部接起来。很然,这样时间相当多,尤其是当用只是修改了其中某一个文件的候,完全没有必要将个文件都重新编译一遍,因很多已生成的目文件是不会改的。要解决问题关键是要灵活运用GCC,同时还要借助像Make这样的工具。
警告提示功能
GCC包含完整的出错检查和警告提示功能,它可以帮助Linux程序写出更加专业美的代。先来读读2所示的程序,段代写得很糟糕,仔细检查一下不挑出很多毛病:
main函数的返回被声明void,但实际应该int
使用了GNU展,即使用long long来声明64位整数,不符合ANSI/ISO C准;
main函数在止前没有return句。
2illcode.c
#include <stdio.h>
void main(void)
{
long long int var = 1;
printf("It is not standard C code!/n");
}

下面来看看GCC是如何帮助程序发现这错误的。当GCC编译不符合ANSI/ISO C准的源代码时,如果加上了-pedantic选项,那使用了法的地方将生相的警告信息:
# gcc -pedantic illcode.c -o illcode
illcode.c: In function `main':
illcode.c:9: ISO C89 does not support `long long'
illcode.c:8: return type of `main' is not `int'

需要注意的是,-pedantic编译选项并不能保编译程序与ANSI/ISO C准的完全兼容,它仅仅只能用来帮助Linux程序个目越来越近。或者话说-pedantic选项帮助程序员发现一些不符合ANSI/ISO C准的代,但不是全部,事上只有ANSI/ISO C准中要求编译断的那些情况,才有可能被GCC发现并提出警告。
除了-pedantic之外,GCC有一些其它编译选项也能够产生有用的警告信息。选项大多以-W开头,其中最有价的当数-Wall了,使用它能使GCC生尽可能多的警告信息:
# gcc -Wall illcode.c -o illcode
illcode.c:8: warning: return type of `main' is not `int'
illcode.c: In function `main':
illcode.c:9: warning: unused variable `var'

GCC
出的警告信息然从格意不能算作是错误,但却很可能成为错误的栖身之所。一个秀的Linux程序员应该尽量避免生警告信息,使自己的代保持简洁美和健壮的特性。
理警告方面,另一个常用的编译选项-Werror,它要求GCC将所有的警告当成错误进理,在使用自动编译工具(如Make等)非常有用。如果编译时带-Werror选项,那GCC会在所有生警告的地方停止编译,迫使程序员对自己的代码进行修改。只有当相的警告信息消除,才可能将编译过继续朝前推行情况如下:
# gcc -Wall -Werror illcode.c -o illcode
cc1: warnings being treated as errors
illcode.c:8: warning: return type of `main' is not `int'
illcode.c: In function `main':
illcode.c:9: warning: unused variable `var'

Linux程序GCC出的警告信息是很有价的,它可以帮助程序写出更加健壮的程序,而且是跟踪和调试程序的有力工具。建在用GCC编译源代码时终带-Wall选项,并把它逐种习惯这对找出常错误很有帮助。
Linux开发软,完全不使用第三方函数的情况是比的,通常来都需要借助一个或多个函数的支持才能完成相的功能。从程序的角度看,函数库实际上就是一些文件(.h)和文件(.so或者.a)的集合。Linux下的大多数函数都默文件放到/usr/include/下,而文件放到/usr/lib/下,但并不是所有的情况都是这样。正因如此,GCC编译时有自己的法来找所需要的文件和文件。
GCC采用搜索目法来找所需要的文件,-I选项可以向GCC文件搜索路径中添加新的目。例如,如果在/home/xiaowp/include/下有编译时所需要的文件,GCC够顺利地找到它,就可以使用-I选项
# gcc foo.c -I /home/xiaowp/include -o foo

,如果使用了不在准位置的文件,那可以通-L选项GCC文件搜索路径中添加新的目。例如,如果在/home/xiaowp/lib/下有所需要的文件libfoo.soGCC够顺利地找到它,可以使用下面的命令:
# gcc foo.c -L /home/xiaowp/lib -lfoo -o foo

得好好解一下的是-l选项,它指示GCC文件libfoo.soLinux下的文件在命名有一个定,那就是应该lib三个字母开头,由于所有的文件都遵循了同范,因此在用-l选项指定接的文件名可以省去lib三个字母,也就是GCC-lfoo,会自接名libfoo.so的文件。
Linux下的文件分两大动态链(通常以.so尾)和静态链(通常以.a尾),两者的别仅在程序所需的代是在运行时动态的,是在编译时的。默情况下,GCC时优先使用动态链,只有当动态链不存在才考使用静态链,如果需要的可以在编译时加上-static选项制使用静态链。例如,如果在/home/xiaowp/lib/下有所需要的文件libfoo.solibfoo.aGCC只用到静态链,可以使用下面的命令:
# gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo

 ###############################text3################################################

GCC for Win32 开发环境介绍(4)


第三章 GCC粗探——GCC的组成与附加参数


第一节 GCC的家族成员


总的来说,GCC应该是一个编译器。可是,为什么我还要在这里介绍GCC的家族成员呢?其实,整套的GCC环境并不是由GCC构成的,他是由多个包所组成的。这些包的互相作用产生了GCC的开发环境。其中,有一些包是你开发应用程序所必备的基本包。离开这些包你将无法正常使用GCC


GCC的基本包列表。


GCC的基本开发环境,主要由一下几个包构成。Binutils,这个是辅助GCC的工具包,里面包含了连接器,汇编器,动态静态库生成程序,等等。GCC,这个包是GCC本身。当然GCC包中还包括一下几个包,如core,java,ada等,每个包都代表了一种语言。然后,就是win32api,mingw-runtime,这个是在Win32下使用的标准函数包。如果,你使用的是Cygwin或者是在Unix环境下,那么这个包就是GlibC


所以,由上所述。GCC的基本包有:binutils gcc glibc/[win32api,mingw-runtime]有了这些包。你基本能够开始编译应用程序了。


当然,如果说你想要写一个小程序。自然这些包已经够了。但是如果你要写一个较大的工程。那么,这些包也许就不能很好的胜任你的工作了。因为,对于一个大的项目,需要编译的文件不只一个,而且还有依赖关系等等。

所以,GCC中还包括gmake包用于管理项目。当然,还有automake。但是我个人还是不太喜欢automakeautomake其实是帮助你自动的管理你的项目,当然实现这个自动也是比较麻烦的,所以与其用automake管理中小型项目,不如用gmake自己写个脚本。不过,automake通常用于源代码发布的应用,如果在开发时使用会延长开发周期。

Gmake,automake,都是通过编译脚本来批量的编译程序。他们能够更具你所给定的依赖关系,来自动的判断需要重新编译的源代码,然后编译。这点的确可以帮助开发人员减轻不少的人力和开发周期。比如,你用Makefile管理一个项目,那么在你第一次编译程序以后,如果你的源代码没有做过任何编辑,那么下次再调用gmake的程序时,gmake就不会再去一一编译每个文件。而是简单的连接一下主程序,或者什么都不作的退出(这要取决于你写的Makefile脚本)


但是,对于有些开发人员来说,上面这些包还是不能满足他们的要求。因为他们要调试程序。所以,GCC还包括另一个包。那就是GDBgdbGCC开发的,用于跟踪调试的,命令符型调试器。它的功能还是比较强大的。基本,你能在VC下做到的,GDB也可以。不过,GDB的命令还是比较多的。掌握一些基本的调试命令一般就够使用了。


总结

GCC开发环境包括如下几大包。

binary

基本包

提供基本的汇编器,连接器等

gcc

基本包

各种语言的编译器,包括C,C++,Ada,Java

Win32api,mingwi-runtime/glibc

基本包

系统函数库

Gmake/automake

需要包

管理项目编译的程序

gdb

附加包

调试程序


第二节 GCC的常用编译参数


VC,TC等编译器不同,GCC其实是可以很方便的在提示符下编译程序的。GCC在提示符下编译程序,并没有如同VC那样的冗长而晦涩的编译参数。相反,却有着比VC更灵活且简短的参数。

不得不承认,不懂GCC编译参数的人,确实会损失一些GCC的强大功能。所以,我下面简单介绍一下GCC的一些基本编译参数。这里,我以C编译器为例。


编译二进制代码

$gcc -c yours.c -o yours.o

使用这段指令,GCC将会把yours.c编译成yours.o的二进制代码。其中,yours.o就类似于VC,TC中的.obj文档。


编译最简单的小程序。

$gcc -o yours yours.c

通过这条指令,GCC将会把yours.c源代码编译成名为yours的可执行程序。当然,您也可以将yours.c改成我们刚才介绍的yours.o文件。这样,gcc将使用编译刚才编译好的二进制文档来链接程序。这里,格式的特点是,-o 后面是一串文件列表,第一个参数是所编译程序的文件名,从第二个开始,就是您编译和连接该可执行程序所需要的二进制文档或者源代码。


编译时将自己的头文件目录设为默认头文件目录

$gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o

这条指令中的-I参数将会把Your_Include_Files_Document_Path添加到你默认的头文件目录中。这样您将可以使用 #include <your_include.h>来导入头文件。


编译时使用自己的静态库存放目录

$gcc -L”Your_Lib_Files_Document_Path” -o yours yours.o

这条指令将会让GCC在连接时除了在默认Lib存放目录中搜索指定的静态库以外,还会在Your_Lib_Files_Document_Path中搜索。


编译时使用静态连接库

$gcc -lyour_lib -o yours yours.o

这条指令将会让GCC在连接时把 libyour_lib.a中您所用到的函数连接到可执行程序中。此处注意,GCC所使用的静态连接库是lib*.a格式的。在连接时,只且仅需要提供*的内容就可以了。


编译时使用优化

$gcc -O2 -c yours.c -o yours.o

使用优化方式编译程序,其中除了-O2以外,还有-O3 -O1等等。他们代表不同的优化等级。最常用的,是-O2优化。当然,还有针对特殊CPU的优化,这里就不介绍了。


编译时显示所有错误和警告信息

$gcc -Wall -c yours.c -o yours.o

GCC在默认情况下,将对一些如变量申请未使用这样的问题或者申请了没有给予初始值的问题忽略。但是,如果使用了-Wall参数,编辑器将列出所有的警告信息。这样,您就可以知道您的代码中有多少可能会在其他操作系统下出错的地方了。(用这个指令看看你的代码有多少地方写的不怎么合适。)


编译连接时,加入调试代码

$gcc -g -o yours yours.c

正如同VCdebug编译模式一样,GCC也有debug模式。添加了-g 参数编译的可执行程序比普通程序略为大一些,其中添加了一些调试代码。这些代码将被gdb所支持。


连接时缩小代码体积

$gcc -s -o yours yours.o

这个参数,似乎我没有在Unix环境下看到过。也不知道具体什么作用。因为有人说Visual-MinGW生成的代码小,于是研究了一下她的编译参数,发现release模式的编译参数就加了这一项。貌似编译后的代码的确缩小了很多。


获得帮助

$gcc --help

这条指令从意思上就能看出,获得gcc的帮助信息。如果您有什么特殊需要,也许这个指令能帮上点小忙。


第三节 如何写一个简单的Makefile


说了半天Makefile管理项目,我想现在该说一下如何写了。其实,Makefile文件总体还是比较容易写的,基本只要你会使用命令行,就可以写Makefile。下面我简单介绍一下Makefile的构成和书写。


一个输出 HelloWorld 的简单Makefile

all:

echo HelloWorld

这个Makefile代码,运行后将在屏幕上打印一个HelloWorldall其实是类似C代码中的main函数。gmake程序将在运行Makefile代码时,首先运行此处的代码。注意,此处echo前面的是<tab>GCC对空格很敏感的。


添加依赖项的Makefile

all:depend

@echo I am the main

depend:closeecho

@echo I am the depend

closeecho:

@echo off

这个Makefile代码,的作用还是输出句子。不同的是她添加了几个指令块之间的依赖关系。其中all依赖于dependdepend依赖于closeecho。这样,程序在编译时将根据脚本的依赖关系来判断文件编译的先后顺序。


执行Makefile

$make -f Makefile

通常情况下,不用-f参数,make程序将在当前目录下搜索名为Makefile的文件作为需要执行的文件。而使用-f将指定Makefile的文件名。


一个完整的Makefile

all:yours

@echo OK

yours:yours.o

gcc -o yours yours.o

yours.o:yours.c

gcc -c yours.c -o yours.o


更多有关Makefile的详细内容请查相关资料。

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2247014次
    • 积分:22167
    • 等级:
    • 排名:第320名
    • 原创:6篇
    • 转载:1124篇
    • 译文:1篇
    • 评论:253条
    最新评论