为啥windous要用dll库,Linux 用so库

  1. 为什么交叉编译能直接生成 ARM 架构的可执行文件,而 Windows 和 Linux 不行
    交叉编译和不同平台的二进制格式
    交叉编译的关键是 目标平台和主机平台的架构差异,比如你从 x86_64 (Ubuntu) 交叉编译到 ARM。这里的 交叉编译工具链(比如 arm-linux-gnueabihf-gcc)会将你的源代码编译成特定架构(如 ARM)的二进制代码。这些代码直接与目标平台的架构兼容,因此可以在 ARM 设备上运行。

但是,Windows 和 Linux 的二进制格式和运行时环境不同。Windows 上的程序依赖于 PE(Portable Executable)格式 和 DLL(动态链接库),而 Linux 则使用 ELF(Executable and Linkable Format)格式 和 SO(共享库)。这意味着,即使你的代码完全相同,操作系统本身如何加载和执行程序的方式是不同的。

Windows 使用 DLL(Dynamic-Link Library) 文件,它们在运行时动态加载所需的库。
Linux 使用 SO(Shared Object) 文件,它们也有相同的动态加载功能。
这就是为什么你在 Linux 上生成的 可执行文件 是 ELF 格式,而在 Windows 上是 PE 格式。这两者完全不兼容,不能直接交换或互操作。你需要分别针对这两个平台编译不同的文件格式和库。

交叉编译器的角色
交叉编译器的作用是根据你所选择的目标平台,生成对应架构和操作系统要求的二进制文件。对于 ARM 设备,交叉编译工具链生成的代码会符合 ARM 的架构要求,而对于 Windows,则需要使用适用于 Windows 的工具链(如 MinGW)来生成 Windows 可执行文件(.exe)。

  1. 为什么 Windows 用 DLL,Linux 用 SO,不能统一吗?
    动态链接库的概念和实现
    DLL(Windows)和 SO(Linux)都是动态链接库,允许程序在运行时加载外部的代码库。两者在功能上基本是等价的,都是为了避免程序在每次运行时都加载重复的库,节省内存空间,并支持库的共享。
    不同操作系统的设计理念
    Windows 的 DLL: Windows 使用 PE 格式(Portable Executable)来管理程序的二进制文件,包括可执行文件和 DLL。DLL 是 Windows 上的动态链接库,它在程序运行时被加载并链接到程序的地址空间。

Linux 的 SO: Linux 使用 ELF 格式(Executable and Linkable Format)来管理二进制文件,SO 是 Linux 上的共享库,它的工作原理和 DLL 类似,但与 Windows 的二进制格式不同。

这些差异并非完全出于技术困难,而是两种操作系统在设计时采取了不同的实现方案。Windows 和 Linux 都选择了最适合它们操作系统架构的方式来处理动态链接库。

为什么不能统一?
二进制格式的不同: 正如前面提到的,Windows 使用 PE 格式,而 Linux 使用 ELF 格式。这两种格式是操作系统设计的一部分,涉及内存管理、执行流程、符号链接等。

系统调用和 ABI(应用二进制接口)的差异: 不同的操作系统有不同的系统调用接口和 ABI。即使在二进制文件格式上可以有类似之处,但其底层如何处理内存、如何调用系统功能等方面也存在巨大差异。

历史原因和向后兼容性: Windows 的 DLL 和 Linux 的 SO 是基于不同历史背景和生态系统发展的。为了兼容旧有的程序和库,操作系统需要保留这些机制。

工具链和运行时的不同: Windows 和 Linux 在库的链接、加载、管理等方面使用了不同的工具链(如链接器、加载器)和运行时环境,这也导致了它们使用不同类型的库文件。

  1. 总结:
    交叉编译:交叉编译时,Windows 和 Linux 的二进制文件格式和系统要求不同,因此需要分别为每个平台编译。
    DLL 和 SO:Windows 和 Linux 都使用动态链接库(DLL 和 SO),但它们的底层实现机制和文件格式不同。无法完全统一,主要因为操作系统架构的不同、历史背景的差异以及系统调用的不同。
    跨平台开发:Qt 提供跨平台开发支持是通过源代码兼容,让你可以用相同的代码在不同平台上运行,但最终需要针对不同平台编译出不同的二进制文件和库。
    所以,简单来说,Windows 和 Linux 用不同的库格式,是因为这两种操作系统在设计和实现上有根本的区别,不能像 ARM 和 x86 架构那样直接交叉编译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8897.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

wordpress实用功能A5资源网同款 隐藏下载框 支付框 需要登录才能查看隐藏的内容

实用功能 隐藏下载框 支付框 需要登录才能查看隐藏的内容, 个人网站防天朝申查实测有效 。 登录前,未登录: 登录后,已登录: 功能说明 该代码段的主要功能是隐藏支付框并为未 登录用户显示一条提示信息,告知他们需要…

C 语言学习-05【数组】

1、一维数组元素的操作 输入一个数&#xff0c;按原来排序的规律将它插入到一个一排列好的数组中&#xff1a; #include <stdio.h>int main() {int i, data, a[10] {2, 3, 6, 9, 11, 12, 14, 17, 19};printf("Primitive series: \n");for (i 0; i < 9; i)…

H5移动端预览PDF方法

新建页面 新建一个页面以便去预览对应的pdf 新建完后在 pages.json 文件内去新增对应路由 页面内容 <template><view class"page"><view class"pdf"><view id"demo"></view></view><view class"b…

嵌入式学习(11)-WS2812灯珠

WS2812的级联控制协议非常简单。通过一根信号线就可以进行串行异步信号发送。 下面显示了四个WS2812通过数据性级联的方式。在串行通讯中使用不同高低电平脉冲表示数据0,1编码。 使用GPIO模拟时序时&#xff1a;GPIO的驱动频率大约是1MHz 硬件电路&#xff1a; 软件代码实现&…

流类库与输入输出

来源&#xff1a;《C语言程序设计》 像C语言一样&#xff0c;C语言也没有输入输出语句。 但C标准库中有一个面向对象的输入输出软件包&#xff0c;即I/O流类库。 流是I/O流类的中心概念。 ------ I/O流类库是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品。 -…

RK3288 android7.1 适配 ilitek i2c接口TP

一&#xff0c;Ilitek 触摸屏简介 Ilitek 提供多种型号的触控屏控制器&#xff0c;如 ILI6480、ILI9341 等&#xff0c;采用 I2C 接口。 这些控制器能够支持多点触控&#xff0c;并具有优秀的灵敏度和响应速度。 Ilitek 的触摸屏控制器监测屏幕上的触摸事件。 当触摸发生时&am…

【AI写作宝-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

一文熟悉新版llama.cpp使用并本地部署LLAMA

0. 简介 最近是快到双十一了再给大家上点干货。去年我们写了一个大模型的系列&#xff0c;经过一年&#xff0c;大模型的发展已经日新月异。这一次我们来看一下使用llama.cpp这个项目&#xff0c;其主要解决的是推理过程中的性能问题。主要有两点优化&#xff1a; llama.cpp …

安全、高效、有序的隧道照明能源管理解决方案

徐悦 &#xff08;安科瑞电气股份有限公司 上海嘉定201801&#xff09; 前言 双碳数字化能源管理对高速公路来说是个新鲜事。今年的中央经济工作会议提出&#xff1a;将“做好碳达峰、碳中和工作”作为2021年的任务之一&#xff0c;而我国高速公路里程15.5万公里&#xff0c;…

Navigating Net 算法简介

0. Inro \textbf{0. Inro} 0. Inro 1️⃣一些要用到的符号 ( U , dist ⁡ ) (U, \operatorname{dist}) (U,dist)为基础度量空间&#xff0c; S ⊆ U S \subseteq U S⊆U为包含 n ≥ 2 n \geq 2 n≥2个对象的 Input \text{Input} Input​ h ⌈ log ⁡ 2 diam ⁡ ( S ) ⌉ h\lef…

flutter 语法糖库 flutter_magic 发布 1.0.1

众所周知&#xff0c;flutter 是一款由谷歌开发的跨平台工具&#xff0c;一直在开发者心中久负盛名。 但是语法死亡嵌套是个诟病。 最近有 flutter 开发者 panjing&#xff0c;发布了 flutter 语法精简库&#xff0c;flutter_magic&#xff0c;可以让语法变成类似 swiftui 一…

【日志】392.判断子序列

2024.11.8 【力扣刷题】 392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/is-subsequence/?envTypestudy-plan-v2&envIdtop-interview-150 整个题从一开始就是打算从双指针的思想往下走的。但是&#xff0c;我设置了四个变量sLeft…

07 Lambda和StreamAPI

目录 1.Lambda表达式 语法格式&#xff1a; 简单示例 2.函数式接口 常见的函数式接口 1. Supplier 2. Consumer 3. Function,> 4. Predicate 总结 3.流式编程——StreamAPI 基本概念 常见的 Stream 操作 1. 创建 Stream 2. 中间操作 3. 终端操作 简单练习 …

TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境

TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境 博客地址&#xff1a;TMDOG的博客 作者自述&#xff1a; 最近忙着整理自己的项目代码&#xff0c;终于有时间更新一下博客。这次的内容是关于如何在Gin框架下集成支付宝的支付沙箱环境&#xff0c;具体包括如何初始化支付…

Docker网络概述

1. Docker 网络概述 1.1 网络组件 Docker网络的核心组件包括网络驱动程序、网络、容器以及IP地址管理&#xff08;IPAM&#xff09;。这些组件共同工作&#xff0c;为容器提供网络连接和通信能力。 网络驱动程序&#xff1a;Docker支持多种网络驱动程序&#xff0c;每种驱动程…

OpenHarmony4.1蓝牙芯片如何适配?触觉智能RK3568主板SBC3568演示

当打开蓝牙后没有反应时&#xff0c;需要排查蓝牙节点是否对应、固件是否加载成功&#xff0c;本文介绍开源鸿蒙OpenHarmony4.1系统下适配蓝牙的方法&#xff0c;触觉智能SBC3568主板演示 修改对应节点 开发板蓝牙硬件连接为UART1&#xff0c;修改对应的节点&#xff0c;路径为…

QT 如何使QLabel的文字垂直显示

想要实现QLabel文字的垂直显示&#xff0c;可以通过使用“文字分割填充换行符”的方式来实现QLabel文字垂直显示的效果&#xff0c;下面是效果图&#xff1a; 具体实现代码&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow:…

数据结构选择题及答案

一、选择题 1、下列查找方法中&#xff0c;&#xff08; &#xff09;适用于查找有序单链表。 A&#xff0e;分块查找; B&#xff0e;哈希查找; C&#xff0e;顺序查找; D&#xff0e;二分查找; 2、在有n个结点的二叉树的二叉链表表示中&#xff0c;空指针数为( )。 A&#xf…

2024上半年上午30

CPU没有减法器的说法

php实现excel表格数据快速入库

项目场景&#xff1a;大概有一百来份excel表格数据需要整理入库&#xff0c;基础字段一样&#xff0c;如果按照传统的处理方法&#xff0c;需要先整理好数据&#xff08;数据清洗、合并等&#xff09;&#xff0c;并且按照系统导入模板整理出来&#xff0c;费时费力。 需要解决…