GCC/G++编译流程与编译选项

程序的编译流程和编译选项

程序的编译流程

  1. 预处理,生成预编译文件

     gcc –E hello.c –o hello.i
    
  2. 编译,生成汇编代码

      gcc –S hello.i –o hello.s
    
  3. 汇编,生成目标文件

    gcc –c hello.s –o hello.o
    
  4. 链接,生成可执行文件

    gcc hello.o –o hello # -o指定输出文件名
    

常见编译选项


-l(这是小写的L):指定要链接的库。库文件的一般命名方式为libpthread.so, 去掉前缀lib和后缀**.so**即是我们要链接的库的名字,例如gcc hello.c -lpthread -o hello。要链接成功,前提是库文件是在默认搜索路径/usr/lib//usr/local/lib/下面。如果不在默认搜索路径下面,就需要其他参数的加持了。


-L:指定库的搜索路径。如果库文件不在默认的库目录下面,即/usr/lib//usr/local/lib/,那么就需要使用这个参数去指定链接目录。例如,有一个名叫math的库在/home/xxx/test/目录下,我们的程序编译时需要用到这个库,那么用法如下:gcc hello.c -L/home/xxx/test -lmath -o hello.exe


-I(这是大写的i): 指定头文件所在目录。如果不加这个参数,编译器将会在默认的头文件目录,即/usr/include/usr/local/include中去搜索头文件。如果制定了-I参数,例如gcc hello.c -I/home/xxx/test -o hello.exe,那么编译器将会首先在指定的目录中去搜索头文件,如果搜索不到,再去默认的路径下搜索,再搜不到则抛出编译错误。


-include: 用于指定单个头文件的路径。一般都是在源码里通过#include "xxx.h"来指定的,所以用的不多。这里提一下#include "xxx.h"#include <xxx.h>的区别。前者会优先搜索当前目录下的xxx.h文件,然后再去默认的头文件目录下搜索。后者则是直接去默认目录搜索。


-static :此选项将禁止使用动态库,所以,编译出来的可执行文件,一般都很大。不需要其他什么运行环境就可以直接运行。

-share :此选项将尽量使用动态库,所以生成文件比较小,但是需要运行该代码的机器包含有程序需要的动态链接库。


-O0,-O1,-O2,-O3:编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高。


-std=c++20:仅g++可用,用于指定C++版本信息。

-std=c99:指定c语言版本。


-Wall 显示所有警告。

猜你喜欢

转载自blog.csdn.net/qq_27350133/article/details/116241956