现在的位置: 首页 > 综合 > 正文

gcc使用大全

2013年08月27日 ⁄ 综合 ⁄ 共 1976字 ⁄ 字号 评论关闭

第一步、是进行预编译,使用-E
参数可以让GCC
在预处理结束后停止编译过程:

gcc -E hello.c -o hello.i

预处理的宏定义插入到hello.i


第二步、是将hello.i
编译为目标代码,这可以通过使用-c
参数来完成:

gcc -c hello.i -o hello.o

也可以通过源文件直接生成

gcc -c hello.c

第三步、是将生成的目标文件链接成可执行文件:

gcc hello.o -o hello

也可以通过源文件直接生成

gcc -o hello hello.c

警告:

1
-pedantic
选项,那么使用了扩展语法的地方将产生相应的警告信息

2
-Wall
使用它能够使GCC
产生尽可能多的警告信息

3
-Werror
,它要求GCC
将所有的警告当成错误进行处理

库依赖:

1
Linux
下的大多数函数都默认:

头文件放到/usr/include/
目录下

而库文件则放到/usr/lib/
目录下


2
GCC
在编译时必须有自己的办法来查找所需要的头文件和库文件。

-I
选项可以向GCC
的头文件搜索路径中添加新的目录。

例如,如果在/home/xiaowp/include/
目录下有编译时所需要的头文件,为了让GCC
能够顺利地找到它们,就可以使用-I
选项:

gcc -o test test.c -I /home/xiaowp/include

-L
选项向GCC
的库文件搜索路径中添加新的目录

例如,如果在/home/xiaowp/lib/
目录下有链接时所需要的库文件libfoo.so
,为了让GCC
能够顺利地找到它,可以使用下面的命令

gcc -o test test.c -L /home/xiaowp/lib -lfoo

值得好好解释一下的是-l
选项,它指示GCC
去连接库文件libfoo.so


Linux
下的库文件在命名时有一个约定,那就是应该以lib
三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l
选项指定链接的库文件名时可以省去lib
三个字母,也就是说GCC
在对-lfoo
进行处理时,会自动去链接名为libfoo.so
的文件。

-static
选项,强制使用静态链接库

如果在/home/xiaowp/lib/
目录下有链接时所需要的库文件libfoo.so
libfoo.a

为了让GCC
在链接时只用到静态链接库,可以使用下面的命令:

gcc -o test test.c -L /home/xiaowp/lib -static -lfoo

选项-O
可以告诉GCC
同时减小代码的长度和执行时间,其效果等价于-O1


在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump
)和延迟退栈(Deferred Stack Pops
)两种优化。

选项-O2
告诉GCC
除了完成所有-O1
级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。

选项-O3
则除了完成所有-O2
级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作。

通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。

许多Linux
程序员都喜欢使用-O2
选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较理想的平衡点。

time ./test
查看程序执行时间

优化虽然能够给程序带来更好的执行性能,但在如下一些场合中应该避免优化代码:

程序开发的时候优化等级越高,消耗在编译上的时间就越长,因此在开发的时候最好不要使用优化选项,只有到软件发行或开发结束的时候,才考虑对最终生成的代码进行优化。

资源受限的时候一些优化选项会增加可执行代码的体积,如果程序在运行时能够申请到的内存资源非常紧张(如一些实时嵌入式设备),那就不要对代码进行优化,因为由这带来的负面影响可能会产生非常严重的后果。

跟踪调试的时候在对代码进行优化的时候,某些代码可能会被删除或改写,或者为了取得更佳的性能而进行重组,从而使跟踪和调试变得异常困难。

加速:

使用管道代替编译中临时文件,

-pipe
加速编译

gcc -pipe foo.c -o foo

GCC
常用选项

-c
通知GCC
取消链接步骤,即编译源码并在最后生成目标文件;

-Dmacro
定义指定的宏,使它能够通过源码中的#ifdef
进行检验;

-E
不经过编译预处理程序的输出而输送至标准输出;

-g3
获得有关调试程序的详细信息,它不能与-o
选项联合使用;

-Idirectory
在包含文件搜索路径的起点处添加指定目录;

-llibrary
提示链接程序在创建最终可执行文件时包含指定的库;

-O
-O2
-O3
将优化状态打开,该选项不能与-g
选项联合使用;

-S
要求编译程序生成来自源代码的汇编程序输出;

-v
启动所有警报;

-Wall
在发生警报时取消编译操作,即将警报看作是错误; 强烈建议你写每一个编译命令时都加上-Wall
选项

-Werror
在发生警报时取消编译操作,即把报警当作是错误;

-w
禁止所有的报警。

抱歉!评论已关闭.