如何在 MinGW 和 Visual Studio (MSVC) 之间共享 DLL
如何在 MinGW 和 Visual Studio (MSVC) 之间共享 DLL
✅ .dll.a
和 .lib
是什么?
1. .dll.a
(MinGW 下的 import library)
- 作用:链接时告诉编译器如何调用 DLL 中的函数。
- 谁用它:MinGW 编译器(如 g++)。
- 来源:使用
dlltool
或编译 DLL 时自动生成。
2. .lib
(MSVC 下的 import library)
- 作用:和
.dll.a
一样,用于链接阶段告诉 MSVC 编译器如何调用 DLL 中的函数。 - 谁用它:Visual Studio(MSVC)。
- 来源:由
lib.exe
工具或 DLL 项目自动生成。
✅ 你有哪些文件需要共享?
例如:
log4cpp.dll
(运行时文件)log4cpp.dll.a
(MinGW链接时使用)log4cpp.def
(可选,导出函数定义)log4cpp.lib
(你可能需要为 VS 生成)
✅ 使用场景举例
场景 | 所需文件 | 编译器 |
---|---|---|
MinGW 使用 log4cpp.dll | log4cpp.dll.a , log4cpp.dll | g++ |
MSVC 使用 log4cpp.dll | log4cpp.lib , log4cpp.dll | cl (VS) |
✅ 如何从 .dll.a
/ .def
生成 .lib
(供 VS 用)
方法一:你已经有 .def
文件(推荐)
lib.exe /def:log4cpp.def /out:log4cpp.lib /machine:x64
方法二:从 .dll
生成 .def
(如果没有 .def
文件)
# 第一步:dump 出导出表
dumpbin /exports log4cpp.dll > log4cpp.exports.txt# 第二步:手动或用脚本生成 log4cpp.def
# 格式大致如下:
LIBRARY log4cpp.dll
EXPORTSsymbol1symbol2...# 第三步:生成 .lib
lib.exe /def:log4cpp.def /out:log4cpp.lib /machine:x64
✅ MinGW 怎么生成 .dll.a
和 .dll
你已经在用 ADD_LIBRARY(... SHARED ...)
和 CMAKE_DEBUG_POSTFIX "d"
,CMake 自动生成 .dll
和 .dll.a
:
liborocos-log4cpp.dll # 运行时库
liborocos-log4cpp.dll.a # 供 g++ 链接用
✅ 在 VS 中使用 MinGW 编译的 DLL
你需要:
- 生成
log4cpp.lib
(方法见上) - 添加
.lib
到 VS 工程的 Linker -> Input - 添加
log4cpp.dll
到可执行文件目录(或放在 PATH 下) - 添加头文件路径(即 include)