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文件和对应的导入库文件。
相关推荐
人工智能训练6 小时前
【极速部署】Ubuntu24.04+CUDA13.0 玩转 VLLM 0.15.0:预编译 Wheel 包 GPU 版安装全攻略
运维·前端·人工智能·python·ai编程·cuda·vllm
_F_y7 小时前
MySQL用C/C++连接
c语言·c++·mysql
源于花海7 小时前
迁移学习相关的期刊和会议
人工智能·机器学习·迁移学习·期刊会议
兩尛7 小时前
c++知识点2
开发语言·c++
xiaoye-duck7 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
Azure_withyou8 小时前
Visual Studio中try catch()还未执行,throw后便报错
c++·visual studio
琉染云月8 小时前
【C++入门练习软件推荐】Visual Studio下载与安装(以Visual Studio2026为例)
c++·visual studio
DisonTangor8 小时前
DeepSeek-OCR 2: 视觉因果流
人工智能·开源·aigc·ocr·deepseek
薛定谔的猫19828 小时前
二十一、基于 Hugging Face Transformers 实现中文情感分析情感分析
人工智能·自然语言处理·大模型 训练 调优
发哥来了8 小时前
《AI视频生成技术原理剖析及金管道·图生视频的应用实践》
人工智能