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 <stdio.h>
#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,然后如下执行。