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 <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,然后如下执行。
请添加图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值