编译,链接基础实验
一、实验介绍
本实验用于演示 GNU GCC 编译和链接的基本方法,通过编译,链接,静态链接,动态链接让用户学习和理解 GCC 的使用方式.
1.1 实验内容
1.编写基本代码
2.对代码进行编译,链接,并执行查看效果
3.添加代码扩展功能,并进行静态链接
4.添加代码扩展功能,并进行动态链接
5.使用静态+动态的混合链接
1.2 实验知识点
- GCC编译的使用方式
- GCC链接的使用方式
- GCC静态链接的使用方式
- GCC动态链接的使用方式
- GCC静态链接+动态链接混用的方式
1.3 实验环境
Ubuntu系统, GCC
1.4 适合人群
本课程难度为一般,属于初级级别课程,适合有代码编写能力的用户,熟悉和掌握GCC的一般用法。
1.5 代码获取
git clone https://github.com/darmac/make_example.git
二、实验原理
依据 GCC 编译与链接的基本使用方式测试编译流程
三、开发准备
进入实验楼课程即可
四、项目文件结构
main.c : 主要文件
add_minus.c add_minus.h : 加减法API及实现
multi_div.c multi_div.h : 乘除法API及实现
五、实验步骤
5.1 编译,链接和执行Hello Cacu
5.1.1 使用git clone获取源代码
执行:
cd ~/Code
git clone https://github.com/darmac/make_example.git
本章节的源代码位于 make_example/chapter0/ 目录下
查看 main.c 文件,内容如下:
#include <stdio.h>
int main(void)
{
printf("Hello Cacu!\n");
return 0;
}
5.1.2 只编译不链接 main.o
执行命令:
gcc -c main.c
可以发现当前文件夹下多了一个 main.o 文件
5.1.3 使用 file 查看 main.o 的格式,并尝试执行
执行:
file main.o
会打印出 log:“main.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped”
表明 main.o 实际上是一个 relocatable 文件。
修改 main.o 的文件属性为可执行:
chmod 777 main.o
再尝试执行main.o文件:
./main.o
会出现错误:“zsh: exec format error: ./main.o”
实际上relocatable文件是不可执行的
5.1.4 对main.o进行链接,并尝试执行
那么怎样才能生成可执行文件呢? 可执行文件需要通过链接来生成.
使用 gcc 将 main.o 链接为 main 文件:
gcc -o main main.o
可以发现文件夹下多了一个 main 文件。
用 file 查看 main 文件格式:
file main
会打印出 log:
“main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for
GNU/Linux 2.6.24, BuildID[sha1]=3753fcc57530a2eb08e63879f8363013bef5d161, not stripped”
此时文件类型已经变更为 “executable” ,执行此文件:
./main
<