【高屋建瓴】彻底理解windows和linux的库连接

devtools/2025/2/26 15:34:30/

Linux 下,与 Windows 的 .lib(静态库、导入库)和 .dll(动态库) 对应的库文件类型如下:

WindowsLinux说明
静态库 (.lib)静态库 (.a)静态链接库,编译时直接将代码合并到可执行文件中,不依赖外部库。
动态库 (.dll)动态库 (.so)共享库,运行时加载,多个程序可以共享,类似 Windows 的 .dll
导入库 (.lib)不存在直接对应在 Linux 下,不需要导入库,编译器/链接器可以直接链接 .so 文件。

1. 静态库在 Windows 和 Linux 下的对应

  • Windows:静态库是 .lib,它是多个 .obj 文件(目标文件)的集合。
  • Linux:静态库是 .aArchive Library),它是多个 .o 文件(目标文件)的集合。

如何生成静态库

在 Linux 下,生成静态库(.a)的方法:

gcc -c mylib.c -o mylib.o      # 生成目标文件
ar rcs libmylib.a mylib.o      # 生成静态库(libmylib.a)

在 Windows 下,类似的过程是:

cl /c mylib.c                  # 生成 .obj 文件
lib /out:mylib.lib mylib.obj   # 生成静态库

2. 动态库在 Windows 和 Linux 下的对应

  • Windows:动态库是 .dll,运行时加载,不会直接链接到可执行文件中。
  • Linux:动态库是 .soShared Object),也不会直接链接到可执行文件中,而是运行时动态加载。

如何生成动态库

在 Linux 下,生成共享库(.so)的方法:

gcc -fPIC -c mylib.c -o mylib.o  # 生成位置无关代码(PIC)
gcc -shared -o libmylib.so mylib.o  # 生成动态库(.so)

在 Windows 下,类似的过程是:

cl /LD mylib.c /Fe:mylib.dll   # 生成动态库(.dll)

3. Windows 的“导入库”在 Linux 下的情况

在 Windows 下,.dll 不能直接被链接,因此需要一个 导入库 (.lib) 来提供符号解析信息。

  • Windows 需要:
    • .dll(动态库)
    • .lib(导入库)
    • .h(头文件)

Linux 下,不需要导入库.so 既可以在运行时动态加载,也可以在编译时直接链接

gcc main.c -o main -L. -lmylib  # 直接链接 .so 文件

所以,Linux 下 .so 既可以作为 Windows .dll 的等效物,也可以直接当成导入库使用,不像 Windows 需要单独的 .lib


4. Linux 下如何使用动态库

方法 1:编译时链接 .so(类似 Windows 的导入库)

gcc main.c -o main -L. -lmylib   # 直接链接 libmylib.so

运行时需要 .soLD_LIBRARY_PATH 里:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main

方法 2:运行时动态加载(类似 LoadLibrary()

在 Windows 下,你可以用 LoadLibrary() 加载 .dll
在 Linux 下,你可以用 dlopen() 加载 .so

#include <dlfcn.h>
void *handle = dlopen("libmylib.so", RTLD_LAZY);

5. 结论

WindowsLinux作用
.lib(静态库).a(静态库)编译时链接,最终代码合并进可执行文件,不需要外部库。
.dll(动态库).so(动态库)运行时加载,可多个程序共享。
.lib(导入库)无直接对应,.so 直接用Linux 下 .so 既能运行时加载,也能编译时链接,不需要额外的 .lib

在 Windows 下,.lib 可能是静态库,也可能是导入库,而在 Linux 下:

  • 静态库始终是 .a
  • 动态库始终是 .so,既可以直接链接,也可以运行时动态加载

http://www.ppmy.cn/devtools/162825.html

相关文章

linux-c 字节序问题--大小端

今天面试被问了一个网络字节系列的问题分享一下&#xff1a; 1.如何将Int转换成byte数组在网络上传输。 2.计算机世界里的大小端问题。 计算机世界里为什么有大小端 硬件设计因素 CPU 架构差异 不同的 CPU 架构在设计时&#xff0c;对于多字节数据在内存中的存储顺序…

基于Java(SpringBoot)+MySQL+Vue实现博客系统+社区

本来是想着写一博客系统的&#xff0c;后来写着写着就变成了一个“四不像”——介于博客和社区之间的一个东西。 start 数据库名称为 graduation 结构&#xff1a; graduation_admin 后台管理页面 (vue)graduation_web 前台页面 (vue)graduation_server 后台api (Java) 1.…

力扣 颜色分类

双指针&#xff0c;滑动窗口&#xff0c;排序。 题目 简单做法&#xff0c;单指针&#xff0c;一直遍历&#xff0c;先排小再排大。找到是0的与指针指的位置做交换&#xff0c;交换后指针在这个位置的任务就结束了&#xff0c;接着去定住下一个&#xff0c;然后依次遍历完一趟…

deepseek sse流式输出

链接 semi-ui-vue聊天组件 - 可以用这个组件优化界面 sse服务端消息推送 webflux&webclient Hi-Dream-Blog - 参考这个博客&#xff0c;可以在后台将markdown语法转为html 文章目录 链接效果代码pom.xmlDeepSeekControllerWebConfigDeepSeekClientAiChatRequestAiChatM…

Linux搜索查找类指令

1、find指令 基本语法&#xff1a;find [搜索范围] [选项] 功能&#xff1a;将从指定目录向下递归地遍历其各个子目录&#xff0c;将满足条件的文件或目录显示在终端。 常用选项&#xff1a; 操作 命令示例 说明 查找指定路径下的所有文件 find /path/to/dir 查找指定目…

STM32MP15-FSMP1A单片机移植Linux系统platform总线驱动

之前在该单片机下移植的Linux驱动是学习过程中&#xff0c;对Linux内核驱动的引导学习&#xff0c;接下来才是比较正常的驱动开发。 在Linux内核中&#xff0c;对于驱动的处理&#xff0c;一般会通过总线进行设备信息和设备驱动的匹配&#xff0c;来达到自动检测外设连接系统以…

服务器离线部署DeepSeek

目标 本次部署的目标是在本地服务器上部署DeepSeek。但是该服务不能连接外网&#xff0c;因此只能使用离线部署的方式。为了一次完成部署。现在云服务器上进行尝试。 云服务器部署尝试 云服务器配置 CentOS72080Ti 11GB 安装准备 1、上传iso并配置为本地yum源 安装前先将…

计算机网络————(一)HTTP讲解

基础内容分类 从TCP/IP协议栈为依托&#xff0c;由上至下、从应用层到基础设施介绍协议。 1.应用层&#xff1a; HTTP/1.1 Websocket HTTP/2.0 2.应用层的安全基础设施 LTS/SSL 3.传输层 TCP 4.网络层及数据链路层 IP层和以太网 HTTP协议 网络页面形成基本 流程&#xff1a…