GCC 编译器 详细总结

简介: GCC 编译器 详细总结

前言:


源文件需要经过编译才能生成可执行文件。


在 Windows 下进行开发时,只需要点几个按钮即可编译,集成开发环境(比如 Visual studio)已经将各种编译 工具的使用封装好了。


Linux 下也有很优秀的集成开发工具,但是更多的时候是 直接使用编译工具;即使使用集成开发工具,也需要掌握一些编译选项。


PC 机上的编译工具链为 gcc、ld、objcopy、objdump 等,它们编译出来的 程序在 x86 平台上运行。要编译出能在 ARM 平台上运行的程序,必须使用交叉编译工具 xxx-gcc、xxx-ld 等(不同版本的编译器的前缀不一样,比如 arm-linux-gcc)


GCC 编译过程(精简版)

一个 C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇 编(assembly)和链接(linking)等 4 步才能变成可执行文件。

通过不同的 gcc 选项可以控制这些过程:

gcc 使用示例: 执行“gcc -o hello hello.c -v”时,可以查看到这些步骤:

可以手工执行以下命令体验一下:

常用编译选项

1.-c


       预处理、编译和汇编源文件,但是不作链接,编译器根据源文件生成 OBJ 文 件。缺省情况下,GCC 通过用`.o'替换源文件名的后缀`.c',`.i',`.s'等, 产生 OBJ 文件名。可以使用-o 选项选择其他名字。GCC 忽略-c 选项后面任何无 法识别的输入文件。


2.-S


       编译后即停止,不进行汇编。对于每个输入的非汇编语言文件,输出结果是 汇编语言文件。缺省情况下,GCC 通过用`.s'替换源文件名后缀`.c',`.i'等 147 / 566 等,产生汇编文件名。可以使用-o 选项选择其他名字。GCC 忽略任何不需要汇编 的输入文件。


3.-E


       预处理后即停止,不进行编译。预处理后的代码送往标准输出。

01370d1b18c29e769e0e3bcdd7535ceb_943560790abb49c9be8260d1d8d05669.png

4.-o file


       指定输出文件为 file。无论是预处理、编译、汇编还是链接,这个选项都可 以使用。如果没有使用`-o'选项,默认的输出结果是:可执行文件为`a.out'; 修改输入文件的名称是`source.suffix',则它的 OBJ 文件是`source.o',汇 编文件是 `source.s',而预处理后的 C 源代码送往标准输出。


5.-v


       显示制作 GCC 工具自身时的配置命令;同时显示编译器驱动程序、预处理器、 编译器的版本号。

示例1:找不到头文件目录,使用-I 指定头文件目录

示例2:libsub.so通常写为lsub,找不到库文件目录,使用-L 指定库文件目录

怎么编译多个文件

1.一起编译、链接:

gcc -o test main.c sub.c

2.分开编译,统一链接:

gcc -c -o main.o main.c

gcc -c -o sub.o sub.c

gcc -o test main.o sub.o

制作、使用动态库

1.制作、编译动态库:


gcc -c -o main.o main.c


gcc -c -o sub.o sub.c


gcc -shared -o libsub.so sub.o sub2.o sub3.o(可以使用多个.o 生成动态库)


gcc -o test main.o libsub.so

gcc -o test main.o libsub.so也可被替换:使用-L 指定库文件目录

2.运行:

1.先把 libsub.so 放到 Ubuntu 的/lib 目录,然后就可以运行 test 程序。

2.如果不想把 libsub.so 放到/lib,也可以放在某个目录比如/a,然后如下执行:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a

./test

制作、使用静态库

1.制作、编译静态库:


gcc -c -o main.o main.c


gcc -c -o sub.o sub.c


ar crs libsub.a sub.o


gcc -o test main.o libsub.a (如果.a 不在当前目录下,需要指定它的绝对或相对路径)

2.运行:

不需要把静态库 libsub.a 放到板子上,直接运行

注意:

执行 arm-buildroot-linux-gnueabihf-gcc -c -o sub.o sub.c 交叉编译需要在最后面加上-fPIC 参数。

相关文章
|
7天前
|
C语言
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
|
1月前
|
C语言
gcc的简易用法
【5月更文挑战第10天】gcc的简易用法。
30 8
|
1月前
|
C语言
gcc的简易用法(编译、参数与链接)
【5月更文挑战第14天】gcc的简易用法(编译、参数与链接)。
21 1
|
1月前
|
Unix Java 编译器
安装gcc
【5月更文挑战第14天】安装gcc。
43 1
|
1月前
|
C语言
转载 - gcc/ld 动态连接库和静态连接库使用方法
本文介绍了如何在GCC中实现部分程序静态链接、部分动态链接。使用`-Wl`标志传递链接器参数,`-Bstatic`强制链接静态库,`-Bdynamic`强制链接动态库。
49 0
|
1月前
|
编译器 Linux C语言
gcc编译器的使用方法
gcc编译器的使用方法
37 1
|
1月前
|
编译器 C语言 C++
列举gcc 常见和有用的编译警告选项
列举gcc 常见和有用的编译警告选项
35 0
|
1月前
|
编译器 C语言
gcc编译警告:warning: suggest parentheses around assignment used as truth value
gcc编译警告:warning: suggest parentheses around assignment used as truth value
45 0
|
1月前
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
54 0
006.gcc编译器
|
1月前
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……
491 1