Windows中xxx.dll动态链接库文件转xxx.a静态库文件

        最近在学习探索C/C++程序代码中调用Python代码时,出现了一个问题:下载的程序库文件,在使用MinGW编译C/C++的代码时,一直提示无法链接,才发现是库类型不对应,无法导入链接。

Windows中xxx.dll动态链接库文件转xxx.a静态库文件_第1张图片

        上图所示的Python对应库,下载链接如下:

1. Embedding Python in Another Application — Python 3.13.3 documentationhttps://docs.python.org/3.13/extending/embedding.html

        特此总结梳理了各种类型库文件格式如下表格,供参考学习:

特性

.dll (Windows)

.so (Linux/Unix)

.a (静态库, Unix)

.lib (Windows 静态库/导入库)

全称

Dynamic Link Library

Shared Object

Archive

Library (Static/Import)

平台

Windows

Linux/macOS/Android

跨平台(Unix-like 常见)

Windows

链接方式

动态链接(运行时)

动态链接(运行时)

静态链接(编译时)

静态链接(编译时)或导入库

文件内容

可执行代码+导出符号

可执行代码+导出符号

多个.o文件的集合

静态库:代码;导入库:DLL 的符号表

依赖关系

运行时需.dll文件

运行时需.so文件

无依赖(代码嵌入可执行文件)

静态库:无依赖;导入库:需.dll

加载方式

LoadLibrary()+GetProcAddress()

dlopen()+dlsym()

直接编译到可执行文件

直接编译到可执行文件(静态库)

更新维护

替换.dll即可更新

替换.so即可更新

需重新编译程序

静态库:需重新编译;导入库:需更新.dll

生成工具

MinGW/MSVC (gcc -shared)

GCC (-shared -fPIC)

ar+gcc

MSVC (lib.exe) / MinGW (ar)

示例命令

gcc -shared a.c -o a.dll

gcc -shared -fPIC a.c -o liba.so

ar rcs liba.a a.o

lib /OUT:a.lib a.obj

(MSVC)

常见用途

Windows 系统库、插件

Linux 系统库、动态模块

嵌入式开发、独立分发

Windows 静态库或 DLL 的导入库

        解决方法:用 gendef + dlltool 生成 MinGW 可用的 .a 文件

1、安装 MinGW 工具链

        确保已安装 MinGW 并包含 gendef 和 dlltool(通常在 mingw64/bin 下)。

MinGW编译器任意版本使用配置经验教程-CSDN博客https://blog.csdn.net/weixin_49337111/article/details/140274770?spm=1001.2014.3001.5502

2、生成 .def 文件

//  通过这条命令,会生成 python313.def,包含 DLL 的导出函数。

gendef python313.dll

3、用 dlltool 生成 .a 文件

dlltool --dllname python313.dll --def python313.def --output-lib python313.a

4、生成 libpython313.a 后,在 CMake 中链接:

target_link_libraries(convert python313.a)

        如下图所示,在操作结束后,生成了所需的库:python313.a

Windows中xxx.dll动态链接库文件转xxx.a静态库文件_第2张图片

你可能感兴趣的:(开发工具,windows,python,vscode,编辑器)