MFC,DLL界面库设计注意

这个错误是由于CShapeBase类的虚表(vtable)没有正确生成或导出。在生成DLL时,需要确保虚函数表正确地在DLL中定义并导出,否则编译器会无法找到所需的符号,从而引发LNK2001错误。

为了解决这个问题,可以尝试以下步骤:

1. 确保所有项目都能正确识别导入/导出符号

在头文件中,使用__declspec(dllexport)__declspec(dllimport)的宏控制条件性地导入或导出符号。确保DLL项目定义了导出宏(例如MFCLIBRARY1_EXPORTS),而使用DLL的项目则不定义。

2. 使用MFCLIBRARY1_API宏控制导入/导出

使用宏MFCLIBRARY1_API修饰类声明,使得导入和导出在编译器之间切换。

3. 确保所有源文件包含同样的头文件

在实现文件中,不需要再使用__declspec(dllexport)。只需在头文件中声明,并确保所有相关代码文件都包含同样的头文件。

修改后的代码如下:

MFCLibrary1.h

#pragma once

#ifndef AFXWIN_H

#error "在包含此文件之前包含 'pch.h' 以生成 PCH"

#endif

#include "resource.h" // 主符号

#ifdef MFCLIBRARY1_EXPORTS

#define MFCLIBRARY1_API __declspec(dllexport)

#else

#define MFCLIBRARY1_API __declspec(dllimport)

#endif

class CMFCLibrary1App : public CWinApp

{

public:

CMFCLibrary1App();

// 重写

public:

virtual BOOL InitInstance();

DECLARE_MESSAGE_MAP()

};

class MFCLIBRARY1_API CShapeBase {

public:

CShapeBase();

virtual void OnDraw(CDC* pDC, int nCount);

virtual ~CShapeBase() {} // 添加虚析构函数确保生成虚表

};

// MFCLibrary1.cpp: 定义 DLL 的初始化例程。

//

#include "pch.h"

#include "framework.h"

#include "MFCLibrary1.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

//

//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,

// 则从此 DLL 导出的任何调入

// MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到

// 该函数的最前面。

//

// 例如:

//

// extern "C" BOOL PASCAL EXPORT ExportedFunction()

// {

// AFX_MANAGE_STATE(AfxGetStaticModuleState());

// // 此处为普通函数体

// }

//

// 此宏先于任何 MFC 调用

// 出现在每个函数中十分重要。 这意味着

// 它必须作为以下项中的第一个语句:

// 出现,甚至先于所有对象变量声明,

// 这是因为它们的构造函数可能生成 MFC

// DLL 调用。

//

// 有关其他详细信息,

// 请参阅 MFC 技术说明 33 和 58。

//

// CMFCLibrary1App

BEGIN_MESSAGE_MAP(CMFCLibrary1App, CWinApp)

END_MESSAGE_MAP()

// CMFCLibrary1App 构造

CMFCLibrary1App::CMFCLibrary1App()

{

// TODO: 在此处添加构造代码,

// 将所有重要的初始化放置在 InitInstance 中

}

// 唯一的 CMFCLibrary1App 对象

CMFCLibrary1App theApp;

// CMFCLibrary1App 初始化

BOOL CMFCLibrary1App::InitInstance()

{

CWinApp::InitInstance();

return TRUE;

}

CShapeBase::CShapeBase() {

// Constructor implementation

}

void CShapeBase::OnDraw(CDC* pDC, int nCount)

{

// Function implementation

}

CShapeBase::~CShapeBase() {}

下面重点!!!

  • 在生成DLL的项目设置中,确保定义了MFCLIBRARY1_EXPORTS宏(在"项目属性"->"C/C++"->"预处理器"->"预处理器定义"中添加MFCLIBRARY1_EXPORTS)。
  • 确保链接器正确识别生成的DLL文件和对应的导入库文件。
相关推荐
1000世界小札5 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
MobotStone5 小时前
从“听得懂”到“干得了”:工业大模型落地工厂的三层进化路线
人工智能
wangruofeng5 小时前
GLM-5.3-Flash 发布:追平 Opus 4.8 的智力,1/40 的价格,跑在国产芯片上
人工智能·aigc·chatglm (智谱)
2601_956121977 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
皮皮虾❀7 小时前
钉钉AI服务商×教育行业:AI现代产业学院共建一体化实战——从“高校AI教学缺平台”到“校企共建AI产业学院培养数字化人才
人工智能·钉钉
fpcc7 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
火山引擎开发者社区8 小时前
【议程来了】火山引擎开发者社区技术日・NVIDIA 独家赞助-成都站
人工智能
三声三视8 小时前
从崩溃日志到 AI 技能:tri-god 蒸馏实战
人工智能·ai·aigc·agent
ZGIAI8 小时前
ZGI Workflow 并发控制:保护下游接口
人工智能·架构
richard_first8 小时前
Transformer 与大语言模型:第9章 LayerNorm 归一化层
人工智能·深度学习·机器学习·transformer