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文件和对应的导入库文件。
相关推荐
云和数据.ChenGuang5 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
西西木科技丨Shopify开发机构6 小时前
CalDigit TS4案例:AI产品图的Shopify整站接入与验收
人工智能·shopify·独立站
2601_965448876 小时前
AI视频制作:做系列节气民俗视频音色不统一,AI 音色克隆省事的方法
人工智能·机器学习·音视频
美狐美颜SDK开放平台6 小时前
视频美颜SDK试用DEMO阶段应该测试什么?直播APP接入实操指南
开发语言·人工智能·深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk
dtq04246 小时前
C++小案例 - 日志实战
开发语言·c++
HRaitest6 小时前
秋招技术岗招聘提效:三类 AI 招聘方案的技术底层与选型逻辑
大数据·人工智能·求职招聘·ai-native
天远数科7 小时前
零信任架构实战:基于天远企业股权变更构建自动化商业银行对公授信存续期股权异动与资产抽逃预警网关
运维·人工智能·架构·自动化
车软学堂7 小时前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
码匠许师傅7 小时前
【C++三方组件】Qt 概览:桌面 C++ 的事实标准与许可证三轨
开发语言·c++·qt
海盗12347 小时前
AI 新闻日报 10-28:Atria Dawn 完整版开源、Cursor Agent SDK 转正、Genie 4 实时世界模型
人工智能·机器人·开源·人工智能aigc