同平台(Windows)下,VC++6 能調用的 DLL,Qt (MinGW/MSVC) 通常也能調用,但需注意導出約定與名稱修飾。
| 因素 | 要求 |
|---|---|
| 調用約定 | DLL 必須用 __stdcall (WINAPI) 導出,Qt 默認 cdecl 需顯式聲明 |
| 名稱修飾 | C++ 類/重載函數會產生修飾名,需 extern "C" 導出純函數或用 .def 文件 |
| 運行庫 | VC++6 用 MSVCRT.dll,Qt MSVC 版用對應 VS 版本 CRT,MinGW 用 msvcrt.dll,混用可能導致堆/鎖不一致 |
| C++ 類導出 | 極不推薦跨編譯器傳遞 C++ 物件(虛表、構造/析構、異常處理不兼容) |
// MyLib.h
#ifdef MYLIB_EXPORTS
#define MYLIB_API __declspec(dllexport)
#else
#define MYLIB_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
MYLIB_API int Add(int a, int b);
MYLIB_API void* CreateContext();
MYLIB_API void DestroyContext(void* ctx);
#ifdef __cplusplus
}
#endif
// .pro
LIBS += -L$$PWD/../lib -lMyLib
// main.cpp
#include "MyLib.h"
#include
int main() {
qDebug() << "Add(1,2)=" << Add(1,2);
void* ctx = CreateContext();
DestroyContext(ctx);
return 0;
}
DLL 僅限 Windows。Linux 需 .so,macOS 需 .dylib,源碼重新編譯即可,介面保持不變。