Linux下GCC使用方法简介【转】

编译:
第一步、是进行预编译,使用-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

警告:
一、-pedantic 选项,那么使用了扩展语法的地方将产生相应的警告信息
二、-Wall 使用它可以使GCC产生尽量多的警告信息
三、-Werror,它要求GCC将全部的警告当成错误进行处理

库依赖:
一、Linux下的大多数函数都默认:
头文件放到/usr/include/目录下
而库文件则放到/usr/lib/目录下
二、GCC在编译时必须有本身的办法来查找所须要的头文件和库文件。
-I选项能够向GCC的头文件搜索路径中添加新的目录。
例如,若是在/home/yy/include/目录下有编译时所须要的头文件,为了让GCC可以顺利地找到它们,就可使用-I选项:
gcc -o test test.c -I /home/yy/include

-L选项向GCC的库文件搜索路径中添加新的目录
例如,若是在/home/yy/lib/目录下有连接时所须要的库文件libfoo.so,为了让GCC可以顺利地找到它,可使用下面的命令
gcc -o test test.c -L /home/yy/lib -lfoo

值得好好解释一下的是-l选项,它指示GCC去链接库文件libfoo.so。
Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头,因为全部的库文件都遵循了一样的规范,所以在用-l选项指定连接的库文件名时能够省去lib三个字母,也就是说GCC在对-lfoo进行处理时,会自动去连接名为libfoo.so的文件。

-static选项,强制使用静态连接库
若是在/home/yy/lib/目录下有连接时所须要的库文件libfoo.so和libfoo.a
为了让GCC在连接时只用到静态连接库,可使用下面的命令:
gcc -o  test  test.c  -L /home/yy/lib  -static  -lfoo程序员

 

编译成动态库:编程

g++  -fPIC  -shared  -o libfunc.so  func.cpp函数

-fPIC参数
表示编译为位置独立的代码,用于编译共享库。目标文件须要建立成位置无关码,概念上就是在可执行程序装载它们的时候,它们能够放在可执行程序的内存里的任何地方。性能


选项-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、-O二、-O3 将优化状态打开,该选项不能与-g选项联合使用;

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

-v 启动全部警报;

-Wall 在发生警报时取消编译操做,即将警报看做是错误;

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

-w 禁止全部的报警。 优化

 

静态连接spa

  在这种链接方式下,函数的代码将直接拷贝到最终的可执行文件中。该程序被执行时候,会被装入该进程的虚拟地址空间中。静态连接库其实是一个或若干目标文件。线程

 

动态连接调试

  这种方式下,函数的代码被放到称做动态链接库或共享对象的某个目标文件中。连接程序此时的工做只是在生成的可执行文件中,记录下共享对象的名字以及少许关键信息。动态链接库能够被多个进程共享,在运行时候内存中只有一个实例。对象

 

两者比较进程

  使用动态连接可以使可执行文件较小,而且当共享对象被多个进程使用时节省内存。但有时候系统运行改变或升级,不能保证动态链接库必定可用、有效。

相关文章
相关标签/搜索