Windows中xxx.dll动态链接库文件转xxx.a静态库文件
最近在学习探索C/C++程序代码中调用Python代码时,出现了一个问题:下载的程序库文件,在使用MinGW编译C/C++的代码时,一直提示无法链接,才发现是库类型不对应,无法导入链接。
上图所示的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