Linux 链接器如何使用静态库来解析引用
文章目录
- 通过进行代码实践
- 静态库在编译时被链接到可执行文件中的基本原理
- 原理总结
- QA:
- .obj文件是什么?
通过进行代码实践
链接器在解析引用时,可以使用静态库来满足对未定义符号的引用。以下是使用静态库的一般步骤:
-
编写代码: 首先,写源代码文件,其中包含对某个库中函数或变量的引用。例如,有一个文件
main.c,其中包含对库函数的调用。// main.c #include <stdio.h>// 外部函数声明,该函数定义在库中 extern void libraryFunction();int main() {printf("Calling library function...\n");libraryFunction();return 0; }
库源码:
//mylibrary.c
#include <stdio.h>
void libraryFunction(){printf("libraryFunction");
}
- 编译对象文件: 编译源文件以生成对象文件。这将创建一个与源文件相对应的
.o或.obj文件。
构建调用函数的目标文件:
gcc -c main.c -o main.o
构建库的目标文件:
gcc -c mylibrary.c -o mylibrary.o
-
创建静态库: 使用编译器工具(通常是
ar)创建静态库。静态库文件的命名通常以lib开头,以.a结尾。ar rcs libmylibrary.a mylibrary.o上述命令将
mylibrary.o文件打包成静态库libmylibrary.a。 -
链接应用程序: 将生成的对象文件与静态库链接起来,以生成可执行文件。
gcc main.o -o myapp -L. -lmylibrary-L.:告诉链接器在当前目录中查找库文件。-lmylibrary:指定链接的库,去掉前缀lib和文件扩展名,链接器会自动查找libmylibrary.a。
-
运行应用程序: 最后,运行生成的可执行文件。
./myapp
运行结果:

目录:

通过这个过程,链接器将在静态库中查找并解析在源代码中引用但未定义的符号,从而完成对库函数的引用。需要确保静态库和可执行文件在相同的目录中,或者通过适当的路径设置使得链接器能够找到静态库。
静态库在编译时被链接到可执行文件中的基本原理
链接器使用静态库解析引用的过程可以分为几个基本步骤,从原理的角度来理解:
-
创建静态库: 静态库是由一组目标文件(
.o或.obj文件)打包而成的。这些目标文件包含了一些编译好的代码和数据,可能是一些函数的实现和相关的数据结构。 -
引用与定义分离: 在源代码中,当你使用
extern声明一个函数或变量时,它表示这个符号是在其他地方定义的,而当前文件中只是引用了它,还没有具体的实现。
链接: extern关键字解析// 在一个源文件中的引用 extern void someFunction(); -
编译阶段: 源代码通过编译器生成目标文件。在编译时,编译器并不关心
extern声明的符号在哪里定义,而只是生成对这些符号的引用。 -
创建可执行文件: 当所有的源文件都被编译成目标文件后,链接器负责将这些目标文件合并成一个可执行文件。在这个过程中,如果某个符号在当前目标文件中没有定义,而只是声明(使用了
extern),链接器会去查找其他的目标文件或静态库来找到符号的定义。 -
静态库链接: 当链接器在链接时遇到
extern声明的符号时,它会查找静态库中的目标文件,然后将符号与静态库中对应目标文件的定义关联起来。这个过程实际上是将静态库中的目标文件提取出来,合并到最终的可执行文件中。 -
生成可执行文件: 最终,链接器生成一个包含所有目标文件和静态库中代码的可执行文件。这个可执行文件中包含了所有符号的定义,使得程序能够正确运行。
原理总结
链接器通过在链接过程中查找静态库中的目标文件,将其合并到可执行文件中,从而解析了对静态库中定义的函数和变量的引用。这样,程序就能够在运行时访问静态库中的功能。这也是静态库在编译时被链接到可执行文件中的基本原理。
QA:
.obj文件是什么?
.obj 文件是一种目标文件(Object File),它是源代码编译后生成的中间文件,包含了汇编或机器代码、符号表以及其他一些用于链接的信息。这个文件是编译过程中的一个阶段,通常在源代码被编译成机器代码之前。
主要的编译过程包括以下步骤:
-
预处理(Preprocessing): 展开宏、包含头文件等。
-
编译(Compilation): 将预处理后的源代码翻译成汇编语言或机器代码。
-
汇编(Assembly): 将汇编代码转化成机器代码,并生成目标文件(
.obj文件)。 -
链接(Linking): 将所有目标文件和可能的库链接在一起,生成最终的可执行文件。
.obj 文件是编译器生成的中间产物,其中包含了编译阶段产生的汇编或机器代码,以及与链接有关的一些元数据,比如符号表(用于记录变量和函数的信息)、重定位信息(用于指示链接器在最终的可执行文件中放置代码的位置)等。
在编译过程中,.obj 文件用于保存每个源文件的编译结果,这样链接器可以在链接阶段将它们组合起来,生成最终的可执行文件。在不同的操作系统和体系结构中,目标文件的格式可能有所不同。在Windows平台上,常见的目标文件格式是 .obj,而在类Unix系统上,通常使用的是 .o 文件。
相关文章:
Linux 链接器如何使用静态库来解析引用
文章目录 通过进行代码实践静态库在编译时被链接到可执行文件中的基本原理原理总结 QA:.obj文件是什么? 通过进行代码实践 链接器在解析引用时,可以使用静态库来满足对未定义符号的引用。以下是使用静态库的一般步骤: 编写代码: 首先&#…...
vue实现滑动验证
效果图: 源码地址:github文档地址: https://github.com/monoplasty/vue-monoplasty-slide-verify 使用步骤:1,安装插件: npm install --save vue-monoplasty-slide-verify 在main.js中使用一下ÿ…...
***Cpolar配置外网访问和Dashy
Dashy是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起,形成自己的导航页。一款功能超强大,颜值爆表的可定制专属导航页工具 结合cpolar内网工具,我们实现无需部署到公网服务器…...
Rancher中使用promtail+loki+grafna收集k8s日志并展示
Rancher中使用promtail+loki+grafna收集k8s日志并展示 根据应用需求和日志数量级别选择对应的日志收集、过滤和展示方式,当日志量不太大,又想简单集中管理查看日志时,可使用promtail+loki+grafna的方式。本文找那个loki和grafana外置在了k8s集群之外。 1、添加Chart Repo …...
modelbox线程爆满宕机bug
序 该bug的解决需要特别感谢张同学。有了大佬的帮助,这个bug才得以解决。 问题现象 modelbox可以进行模型推理,但压测一段时间后,modelbox会宕机,并发生段错误。 “libgomp: Thread creation failed: Resource temporarily una…...
KUKA机器人如何在程序中编辑等待时间?
KUKA机器人如何在程序中编辑等待时间? 如下图所示,如何实现在P1点和P2点之间等待设定的时间? 如下图所示,可以直接输入wait sec 2(等待2秒), 如下图所示,再次选中该程序后&#…...
MQ入门简介
当年入门MQ时跟着尚硅谷RabbitMQ视频学习所做的一些笔记,现在上传方便有需要小伙伴查看 一:MQ的相关概念 1.什么是MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内…...
如何正确使用缓存来提升系统性能
文章目录 引言什么时候适合加缓存?示例1示例2:示例3: 缓存应该怎么配置?数据分布**缓存容量大小:**数据淘汰策略 缓存的副作用总结 引言 在上一篇文章IO密集型服务提升性能的三种方法中,我们提到了三种优化…...
IDEA中Terminal配置为bash
简介 我们日常命令行都是使用Linux的bash指令,但是我们的开发基本都是基于Windows上的IDEA进行开发的,对此我们可以通过将IDEA将终端Terminal改为git bash自带的bash.exe解决问题。 配置步骤 安装GIT 这步无需多说了,读者可自行到官网下载…...
C# 字符串格式化
写在前面 在日常编程中,经常需要对字符串进行格式化操作,以便呈现为不同的格式,满足各种各样的显示需求,C#的字符串格式化参数是非常丰富的,这里做个简单的列举,以供后续参考和延伸。 代码实现 var curr…...
基于亚马逊云科技新功能:Amazon SageMaker Canvas无代码机器学习—以构建货物的交付状态检测模型实战为例深度剖析以突显其特性
授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道。 目录 🚀一. Amazon SageMaker 🔎1.1 新功能发布:A…...
基于Spring Boot、Mybatis、Redis和Layui的企业电子招投标系统源码实现与立项流程
招投标管理系统是一款适用于招标代理、政府采购、企业采购和工程交易等领域的企业级应用平台。该平台以项目为主线,从项目立项到项目归档,实现了全流程的高效沟通和协作。通过该平台,用户可以实时共享项目数据信息,实现规范化管理…...
electron这样使用更安全
背景: electron大家平时为了方便使用,或是一些网上demo的引导,会让渲染进程的业务界面支持直接使用nodejs,这种开发方式有一定的安全隐患,如果业务界面因为xss之类的漏洞被注入其他代码,危害非常大&#x…...
DPDK多进程之间的通信
文章目录 前言本机DPDK IPC API介绍demo演示 前言 DPDK的主进程和辅助进程之间共享大页内存。关于DPDK多进程的支持文档介绍见:47. 多进程支持。 本文介绍本机DPDK的主进程和辅助进程之间交换短消息的API的使用。 前置要求:DPDK-Hello-World示例应用程…...
Python文本信息解析:从基础到高级实战‘[pp]]‘[
更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python文本信息解析:从基础到高级实战,全文3600字,阅读大约10分钟。 文本处理是Python编程中一项不可或缺的技能,覆盖了广泛的…...
c语言多线程队列实现
为了用c语言实现队列进行多线程通信,用于实现一个状态机。 下面是实现过程 1.实现多线程队列入栈和出栈,不加锁 发送线程发送字符1,接收线程接收字符并打印。 多线程没有加锁,会有危险 #include "stdio.h" #include …...
一分钟带你了解电容
电容器中的电容究竟是怎么定义的? 一个电容器,如果带1库的电量时两级间的电势差是1伏,这个电容器的电容就是1法拉,即:CQ/U 。但电容的大小不是由Q(带电量)或U(电压)决定…...
SQLAlchemy 第一篇
安装SQLAlchemy pip install SQLAlchemy查看当前版本 # 查看当前版本import sqlalchemyprint(sqlalchemy.__version__)2.0.23创建数据库连接 此处我们以pymysql为mysql的数据库驱动 安装pymysql pip install pymysqlfrom sqlalchemy import create_engine engine create_…...
Node.js模块化的基本概念和分类及使用方法
1.模块概念 模块:指解决一个复杂问题的时候,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来讲,模块是可以组合、分解和更换的单元。 在编辑领域中的模块,就是遵守固定的规则,把一个大文件拆成独立并且相互…...
SpringBoot整合Lucene实现全文检索【详细步骤】【附源码】
笑小枫的专属目录 1. 项目背景2. 什么是Lucene3. 引入依赖,配置索引3.1 引入Lucene依赖和分词器依赖3.2 表结构和数据准备3.3 创建索引3.4 修改索引3.5删除索引 4. 数据检索4.1 基础搜索4.2 一个关键词,在多个字段里面搜索4.3 搜索结果高亮显示4.4 分页检…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
