gcc编译过程

gcc编译器的使用

GCC仅仅是一个编译器,不是IDE,没有界面,只能在命令行下使用。GCC是可以直接完成源文件的编译。经常使用的命令就是直接生成一个可执行文件

gcc编译过程

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

请添加图片描述

gcc 源文件
gcc 源文件 -o 可执行文件

这样可以把源文件直接编译为可执行文件,并且为可执行文件指定名称

gcc使用实例

gcc hello.c // 输出一个名为 a.out 的可执行程序,然后可以执行./a.out
gcc hello.c -o hello // 输出名为 hello 的可执行程序,然后可以执行./hello
gcc hello.c -o hello -static // 静态链接
gcc hello.c -o hello.o  -c // 先编译(不链接)
gcc hello.o -o hello  // 再链接

试着执行以下命令:(“编译”的 4 个步骤)

gcc -E -o hello.i hello.c	//预处理
gcc -S -o hello.s hello.i	//编译
gcc -c -o hello.o hello.s	//汇编
gcc -o hello hello.o		//链接

常用编译选项

常用选项 描述
-E 预处理,开发过程中想快速确定某个宏可以使用“-E- dM”
-c 把预处理、编译、汇编都做了,但是不链接
-o 指定输出文件
-I 指定头文件目录
-L 指定链接时库文件目录
-l 指定链接哪一个库文件

怎么编译多个文件

1、一起编译(以main.c 和sub.c为例)

gcc main.c sub.c -o test

当头文件和源文件非常多的时候,使用GCC基本命令编译是非常麻烦的。每次调试都需要重新编译。当修改了某一个头文件时,只需要重新链接就可以了。
2、分开编译,再一起链接

gcc main.c -o main.o  -c
gcc sub.c -o sub.o -c
gcc main.o sub.o -o test 
#include 		
#include "sub.h"

<> 表示引用标准库头文件,编译器会从系统配置的库环境中去寻找
" " 一般表示用户自己定义使用的头文件,编译器默认会从当前文件夹中寻找,如果找不到,则到系统默认库环境中去寻找。

常见问题:

1、找不到头文件
请添加图片描述
①用gcc main.c -o main.o -c -I ./到头文件指定目录下
②把这个头文件放到工具链所指的目录里

2、gcc main .c -o test
没有用到子函数sub_fun对应的头文件
请添加图片描述
gcc main .c sub.c -o test 把sub.c链接进去
②用静态库去实现

gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
ar crs libsub.a sub.o(可以使用多个.o 生成静态库)
gcc main.o libsub.a -o test (如果.a 不在当前目录下,需要指定它的绝对或相对路径)

再来执行test

③用动态库去实现

gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -shared sub.o  -o libsub.so (可以使用多个.o 生成动态库)
gcc main.o -o test2 -L /libsub.so/所在目录/ -lsub 

执行test2就会出现问题:
编译的时候使用-L指定库的位置,但是运行的时候就没有指定了,这里需要指定libsub.so的位置

请添加图片描述
⑴ 先把 libsub.so 放到 Ubuntu 的/lib 目录,然后就可以运行 test2 程序。
⑵ 如果不想把 libsub.so 放到/lib,也可以放在某个目录比如/a,然后如下执行。
请添加图片描述

你可能感兴趣的:(笔记,linux)