iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言图文并茂详解链接过程
  • 693
分享到

C语言图文并茂详解链接过程

2024-04-02 19:04:59 693人浏览 独家记忆
摘要

目录一、链接器的意义二、模块链接三、小结一、链接器的意义 连接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。 二、模块链接 静态链接 由链接器在

一、链接器的意义

连接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。

二、模块链接

静态链接

由链接器在链接时将库的内容直接加入到可执行程序中

linux下静态库的创建和使用

  • 编译静态库源码GCc -c lib.c -o lib.o
  • 生成静态库文件:ar -q lib.a lib.o
  • 使用静态库编译:gcc main.c lib.a -o main.out

下面看一段静态链接示例的代码:

slib.c

char* name()
{
    return "Static Lib";
}
 
int add(int a, int b)
{
    return a + b;
}

Test.c

#include <stdio.h>
 
extern char* name();
extern int add(int a, int b);
 
int main()
{
    printf("Name: %s\n", name());
 
    printf("Result: %d\n", add(2, 3));
 
    return 0;
 
}

输入gcc -c slib.c -o slib.o,编译静态库源码:

输入ar -q slib.a slib.o,生成静态库文件:

输入gcc Test.c slib.a -o Test.out,使用静态库编译,生成 .out 文件:

然后输入 ./Test.out,就可以运行了,如下:

如果把 slib.o,slib.a 文件全部删除,运行 ./Test.out,发现能正常运行,这就是前面说的 .o 文件和 .a 文件完全被链接进了可执行程序里面,可执行程序的运行跟 .o 文件和 .a 文件没有任何关系。

动态链接

  • 可执行程序在运行时才动态加载库进行链接
  • 库的内容不会进入可执行程序当中

Linux下动态库的创建和使用

编译动态库源码:gcc -shared dlib.c -o dlib.so

使用动态库编译:gcc main.c -ldl -o main.out

关键系统调用

  • dlopen:打开动态库文件
  • dlsym:查找动态库中的函数并返回调用地址.
  • dlclose:关闭动态库文件

下面看一个动态链接示例:

dlib.c

char* name()
{
    return "Dynamic Lib";
}
 
int add(int a, int b)
{
    return a + b;
}

Demo.c

#include <stdio.h>
#include <dlfcn.h>
 
int main()
{
    void* pdlib = dlopen("./dlib.so", RTLD_LAZY);
 
    char* (*pname)();
    int (*padd)(int, int);
 
    if( pdlib != NULL )
    {
        pname = dlsym(pdlib, "name");
        padd = dlsym(pdlib, "add");
 
        if( (pname != NULL) && (padd != NULL) )
        {
            printf("Name: %s\n", pname());
            printf("Result: %d\n", padd(2, 3));
        }
 
        dlclose(pdlib);
 
    }
 
    else
    {
        printf("Cannot open lib ...\n");
    }
    return 0;
}

先输入 gcc -shared dlib.c -o dlib.so,编译动态库源码:

再输入gcc Demo.c -ldl -o Demo.out,使用动态库编译,生成 .out 文件:

然后输入 ./Demo.out,就可以运行了,如下:

如果把 dlib.so 给删了,运行就会报错:

所以dlib.so 这个库文件是在程序的运行阶段被动态加载到内存中去,这就是与静态链接的区别。

三、小结

链接是指将目标文件最终链接为可执行程序

根据链接方式的不同,链接过程可以分为:

  • 静态链接:目标文件直接链接进入可执行程序
  • 动态链接:在程序启动后才动态加载目标文件

到此这篇关于C语言图文并茂详解链接过程的文章就介绍到这了,更多相关C语言 链接过程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言图文并茂详解链接过程

本文链接: https://www.lsjlt.com/news/146519.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言图文并茂详解链接过程
    目录一、链接器的意义二、模块链接三、小结一、链接器的意义 连接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。 二、模块链接 静态链接 由链接器在...
    99+
    2024-04-02
  • C语言图文并茂详解程序编译过程
    目录一、初识编译器二、程序被编译的过程三、小结一、初识编译器 编译器是一个广义的概念,真正的编译器由下面几个模块组成,真正的编译器是进行语法分析和语义分析的。 二、程序被编译的过程...
    99+
    2024-04-02
  • C语言图文并茂讲解分支语句用法
    目录一、if 语句分析二、switch 语句分析三、小结一、if 语句分析 if 语句用于根据条件选择执行语句else 不能独立存在且总是与它最近的 if 相匹配else 语句后可以...
    99+
    2024-04-02
  • C++图文并茂讲解继承
    目录一、生活中的例子二、惊艳的继承三、继承的意义四、小结一、生活中的例子 组合关系∶整体与部分的关系 下面看一个组合关系的描述代码: #include <iostream&g...
    99+
    2024-04-02
  • php案例:$_SERVER详解(图文并茂)
    作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 前言$_SERVER['PHP_SELF']$_SERVER['SERVER_ADDR...
    99+
    2023-09-08
    php 服务器 apache
  • C++图文并茂分析讲解模板
    目录1.内容引入2.模板函数C语言写交换函数C++写交换函数模板交换函数的语法及其原理语法原理理解显示实例化和隐式实例化关于编译器也是懒人这件事3.类模板1.内容引入 ​ 不知道大家...
    99+
    2024-04-02
  • C语言链接的过程是什么
    这篇“C语言链接的过程是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言链接的过程是什么”文章吧。一、链接器的意义连...
    99+
    2023-06-30
  • Java图文并茂详解NIO与零拷贝
    目录一、概念说明1、传统IO2、mmap3、sendfile4、mmap与sendfile二、传统IO传输文件代码示例1、服务端代码2、客户端代码3、控制台出输出三、NIO传输文件代...
    99+
    2022-11-16
    Java NIO与零拷贝 Java NIO Java 零拷贝
  • C语言 超详细讲解链接器
    目录1 什么是链接器2 声明与定义3 命名冲突3.1 命名冲突3.2 static修饰符4 形参、实参、返回值5 检查外部类型6 头文件1 什么是链接器 典型的链接器把由编译器或汇编...
    99+
    2024-04-02
  • C++图文并茂分析讲解内存管理
    目录1.了解一些基本的内存段(图演示)验证栈是向下生长的验证堆一般是向上生长的(不一定)巩固内存管理知识点答案2.c++申请动态内存的新玩儿法new,delete回顾c语言动态内存管...
    99+
    2024-04-02
  • C++图文并茂讲解类型转换函数
    目录一、类型转换函数(上)1.再论类型转换2.问题3.再论构造函数4.另一个视角5.编译器的行为6.小结(上) 二、类型转换函数(下)1.类型转换2.编译器的行为3.注意事...
    99+
    2024-04-02
  • SpringBoot图文并茂详解如何引入mybatis与连接Mysql数据库
    目录创建一个SpringBoot项目创建mysql表编写实体类配置Mapper感叹创建一个SpringBoot项目 其他不赘叙了,引入MyBaties、MySql依赖 创建mysq...
    99+
    2024-04-02
  • C语言指针的图文详解
    目录指针是什么?指针和指针变量1. 指针类型决定了指针进行解引用操作的时候,能访问空间的大小2. 指针加减整数野指针野指针的成因指针和数组二级指针指针数组、数组指针总结指针是什么? ...
    99+
    2024-04-02
  • C语言链表与单链表详解
    链表是什么及链表的优势 链表是一种介于数组的另外一种数据结构: 我们知道数组可以存放很多的元素,这些元素都是呈线性排列,也就是一个挨着一个连续存放 但是当元素足够多时,还能继续正常的...
    99+
    2024-04-02
  • C语言单链表的图文示例讲解
    目录一、单链表的结构二、单链表的函数接口1. 申请结点及打印单链表2. 尾插尾删3. 头插头删4. 中间插入和删除1. 在 pos 指向的结点之后插入结点2. 在 pos 指向的结点...
    99+
    2023-02-14
    C语言单链表的基本操作 C语言单链表
  • C语言邻接表建立图详解
    目录有向图无向图邻接表存图进行拓扑排序总结有向图 代码: #include<stdio.h> #include<stdlib.h> #include<...
    99+
    2024-04-02
  • 详解C语言之单链表
    目录一、思路步骤1. 定义结构体2.初始化3.求当前数据元素的个数4.插入5.删除6.释放内存空间二、代码总结 一、思路步骤 1. 定义结构体 a.数据域:用来存放数据 b.指针域...
    99+
    2024-04-02
  • C语言 推理证明带环链表详细过程
    目录什么是带环链表:判断链表是否带环:环形链表 I找带环形链表入环的第一个结点:环形链表 II什么是带环链表: 带环链表是链表最后一个结点的指针域不是指向空指针,而是指向链表之前的结...
    99+
    2024-04-02
  • C语言二分查找图文详解
    目录一、二分查找算法1.假定给定的数组中元素个数为奇数个2.假定给定的数组为偶数个3.假定给定的数不在此数列中二、分支语句中应注意的小点1.悬空else语句2.switch语句中的b...
    99+
    2023-05-18
    c语言二分查找 c语言二分查找代码 c语言二分查找法
  • Python生成图文并茂的PDF报告的方法详解
    目录安装第三方库模块导入封装不同内容对应的函数生成报告reportlab是Python的一个标准库,可以画图、画表格、编辑文字,最后可以输出PDF格式。它的逻辑和编辑一个word文档...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作