使用GCC

使用GCC

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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值