首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VC++6 調用 DLL 成功,Qt 能否調用同一 DLL?跨編譯器 ABI 相容性分析

     編輯:程式設計疑難解答

結論

同平台(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++ 物件(虛表、構造/析構、異常處理不兼容)

最佳實踐:純 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

Qt 端調用

// .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,源碼重新編譯即可,介面保持不變。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved