error C2491: 'YourFunction' : definition of dllimport function not allowed
// 中文:不允許 dllimport 函數的定義
在 DLL 導出頭文件中,同一函數被標記為 __declspec(dllimport)(導入),但在實現文件(.cpp)中又給出了函數體定義。編譯器發現:你既說「這函數從別的 DLL 導入」,又在當前模組定義了它——邏輯矛盾。
// MyDLL.h - 共享頭文件
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport) // 客戶端引入時定義為導入
#endif
MYDLL_API void Foo(); // 聲明
// MyDLL.cpp - 實現文件
#include "MyDLL.h"
MYDLL_API void Foo() { ... } // 定義:此處 MYDLL_EXPORTS 應已定義,展開為 dllexport
問題出在:實現文件 未定義 MYDLL_EXPORTS,導致宏展開為 dllimport,隨後出現函數定義 → C2491。
MYDLL_EXPORTSstdafx.h / 專用頭文件最頂部強制定義:#define MYDLL_EXPORTS// MyDLL.cpp
#define MYDLL_EXPORTS // 必須在包含頭文件之前!
#include "MyDLL.h"
MYDLL_API void Foo() { ... } // 此處展開為 __declspec(dllexport)
// MyDLL.h
#ifdef BUILDING_MYDLL
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
// MyDLL.cpp
#define BUILDING_MYDLL
#include "MyDLL.h"
dllexport(可在輸出窗口查看預處理結果 /P)dllimport__declspec 方式二選一,別混用// 變量導出同樣遵循此規則
MYDLL_API int g_globalVar; // 頭文件聲明
MYDLL_API int g_globalVar = 42; // 實現文件定義(需在導出宏生效下)