C语言 超详细讲解链接器

C语言 超详细讲解链接器

什么是链接器

在C语言编写代码时,我们往往需要调用一些库函数,比如printfmalloc等等。这些库函数在我们的代码文件中并没有实现,而是存储在系统或其他库文件中,我们需要通过链接器把这些函数与我们编写的代码组合在一起,生成可执行程序。

链接器主要负责以下两个任务:
- 符号解析:将目标文件中引用的符号与定义的符号建立联系。
- 符号重定位:将目标文件中引用的符号地址引用替换为实际的地址。

静态链接

静态链接是将所有目标文件和库文件的编译结果一起链接成一个独立的可执行文件。这样生成的可执行文件包含了所有代码和数据,以及被程序引用的库函数和操作系统函数。

静态链接的过程:
1. 预处理目标文件:将源代码预处理成为独立的*.o目标文件。

gcc -c a.c -o a.o
  1. 预处理库文件:将需要的库文件进行预处理,生成库目标文件。
gcc -c lib.c -o lib.o
  1. 静态链接:
gcc a.o lib.o -o prog
  1. 运行可执行文件:
./prog

示例1:工程调用printf函数

main.c文件如下:

#include <stdio.h>

int main()
{
    printf("Hello, world!\n");
    return 0;
}

编译过程:

gcc -o main main.c

执行结果:

Hello, world!

示例2:工程调用某个库函数

math.h头文件中包含了数学库函数sqrt的声明,我们可以通过链接数学库来使用这个函数。

main.c文件如下:

#include <stdio.h>
#include <math.h>

int main()
{
    double result = sqrt(2.0);
    printf("sqrt(2.0)=%f\n", result);
    return 0;
}

编译过程:

gcc -o main main.c -lm

-lm参数表示链接数学库。

执行结果:

sqrt(2.0)=1.414214

动态链接

动态链接是指在程序运行时才将程序需要的库文件动态链接到程序中。这样生成的可执行文件不包含库函数和操作系统函数的代码,而是在程序执行时才从动态库文件中加载。

动态链接的优点是可以减少可执行程序的大小,减少内存占用,但是需要一定的额外开销来加载动态链接库。

动态链接过程:
1. 预处理目标文件:同静态链接。

gcc -c a.c -o a.o
  1. 创建共享库:将编译生成的*.o目标文件生成共享连接库。其中,Linux 需要将后缀.so,链接库标记添加--shared,Windows 需要将后缀.dll,链接库标记添加/DLL
gcc -shared lib.c -o lib.so
  1. 动态链接可执行文件:
gcc -o prog a.o -L. -l:lib.so
  1. 运行可执行文件
./prog

示例3:工程调用共享库函数

shared_lib.c文件如下:

#include <stdio.h>

void show(int n)
{
    printf("show: %d\n", n);
}

编译成动态库:

gcc -shared shared_lib.c -o libshared_lib.so

Windows,编译成dll:

gcc -shared shared_lib.c -o shared_lib.dll

main.c文件如下:

#include <stdio.h>

void show(int);

int main()
{
    show(3);
    return 0;
}

编译动态链接版本可执行文件:

gcc -o dynamic main.c -L. -l:libshared_lib.so

Windows,编译dll:

gcc -o dynamic.exe main.c -L. -l:shared_lib.dll

执行结果:

show: 3

总结

链接器是任何编程语言工具链中都不可缺少的一环。静态链接和动态链接都是链接器的重要功能,对C语言程序的编译和运行有着至关重要的作用。对于理解代码模块化及整体编译过程更是有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 超详细讲解链接器 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C/C++ Qt 数据库与TableView实现多组件联动

    下面我将为你详细讲解如何使用 C/C++ Qt 实现数据库和 TableView 的联动。 准备工作 在开始之前,我们需要先准备好以下工具和环境: Qt:这是一个跨平台的 C++ 应用程序开发框架,我们将使用 Qt 来开发我们的程序。 MySQL:一个关系型数据库管理系统,我们将使用它来存储和管理我们的数据。 Qt Creator:这是一个供 Qt 开发者使…

    C 2023年5月22日
    00
  • C语言三种函数调用约定_cdecl与_stdcall及_fastcall详细讲解

    C语言三种函数调用约定_cdecl与_stdcall及_fastcall详细讲解 在C语言中,函数调用约定(Function Call Convention)是指编程语言如何在调用函数时传参、返回值等一系列约定。C语言中常用的函数调用约定有三种:cdecl、stdcall和fastcall。本文将对这三种函数调用约定进行详细讲解。 cdecl调用约定 cde…

    C 2023年5月22日
    00
  • 模拟实现strlen的三种方法

    一、strlen()的工作原理 二、模拟实现strlen的三种方法 计数器方法 指针-指针 递归的方法 三、库函数实现strlen的思路 四、库函数的strlen同上面模拟实现strlen的区别 一、strlen工作原理 strlen函数工作原理:是计算字符串str的长度,直到空字符串结束,但不包含空字符串。(即该长度算至/0结束,但不包含/0) 通过以下代…

    C语言 2023年4月18日
    00
  • C程序 寻找两个整数之间的阿姆斯特朗数字

    C程序 寻找两个整数之间的阿姆斯特朗数字使用攻略 概述 该程序是一个 C 语言的代码,用于寻找两个整数之间的阿姆斯特朗数字。阿姆斯特朗数字指的是一个 n 位数 (n ≥ 3),它的每个数位上的数字的 n 次幂之和恰好等于它本身。例如,1³ + 5³ + 3³ = 153。 程序运行环境 操作系统:Windows或Linux 编程语言:C语言 编译器:GCC编…

    C 2023年5月9日
    00
  • 快云新架构震撼公测 1元体验300台高配置云服务器

    快云新架构震撼公测 1元体验300台高配置云服务器攻略 1. 登录快云官网 首先,在浏览器中输入https://www.kuaicloud.com/,进入快云的官方网站。 2. 注册账号并实名认证 如果您还没有在快云注册账号,请先注册一个账号并完成实名认证。实名认证可以提高您的账号安全等级,并对后续使用快云的操作起到保障作用。 3. 进入快云产品购买页面 在…

    C 2023年5月22日
    00
  • 在C/C++语言中使用正则表达式

    当我们需要在C或C++程序中进行字符串匹配时,可以使用正则表达式来完成。下面是使用C和C++语言中的正则表达式的详细攻略。 步骤1:包含正则表达式库的头文件 在C++程序中使用正则表达式需要包含 <regex> 头文件,在C程序中使用需要包含 <regex.h> 头文件。 步骤2:定义一个正则表达式对象 在C++中使用 regex 类…

    C 2023年5月23日
    00
  • 详解几十行代码实现一个vue的状态管理

    下面我将详细讲解如何实现一个vue的状态管理。 1. 状态管理器的作用 在使用Vue进行大型前端应用开发时,随着组件数量的增加,组件之间的状态共享也变得越来越复杂。这时候就需要一个或多个状态管理器来维护应用的整体状态,使得组件间的状态共享变得更加灵活、稳定。 2. 状态管理器的实现 一个简单的vue状态管理器有以下几个基本要素: 2.1. 状态(state)…

    C 2023年5月23日
    00
  • Linux下如何用GCC编译动态库

    Linux下如何用GCC编译动态库 1. 准备工作 在开始编译动态库之前,需要先安装GCC。如果还没有安装,可以使用以下命令进行安装: sudo apt-get install build-essential 此外,编译动态库还需要用到以下两个选项: -shared:将目标文件编译为共享库 -fPIC:编译时生成位置无关代码 2. 编译动态库 下面是编译动态…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部