【实验楼系列】【makefile】编译,链接基础实验

本实验详细介绍了GNU GCC的编译、链接、静态链接和动态链接过程。通过创建和扩展Cacu项目,演示了从基本的Hello World到使用加减乘除功能的动态静态库混合链接。实验涵盖从编译单个源文件到创建静态库(.a)和动态库(.so),并测试不同链接方式的执行效果。
摘要由CSDN通过智能技术生成

编译,链接基础实验

一、实验介绍

本实验用于演示 GNU GCC 编译和链接的基本方法,通过编译,链接,静态链接,动态链接让用户学习和理解 GCC 的使用方式.

1.1 实验内容

1.编写基本代码

2.对代码进行编译,链接,并执行查看效果

3.添加代码扩展功能,并进行静态链接

4.添加代码扩展功能,并进行动态链接

5.使用静态+动态的混合链接

1.2 实验知识点

  1. GCC编译的使用方式
  2. GCC链接的使用方式
  3. GCC静态链接的使用方式
  4. GCC动态链接的使用方式
  5. 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
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值