VC6中全局变量问题和错误:already defined in StdAfx.obj

本文介绍了如何在VC6中正确地定义全局变量以避免重复定义的错误。通过将变量定义放置于stdafx.cpp文件中,并在需要使用的文件中进行extern声明,可以有效解决此问题。
VC6如果想在stdafx.h中定义全局变量,由于该头文件会被include多次,所以,经常会出现以下经典的错误:already defined in StdAfx.obj。
解决方法:把该变量的定义int g_flag放到stdafx.cpp中,然后在使用的地方extern一下。假如你在CAADlg.cpp中使用了该变量g_flag,那么就在CAADlg.cpp的首部,构造函数的定义之外,添加上 extern int g_flag;
这样就没错了。
这只是我遇到错误后从网上查的,我并不明白其中的意思。
如果哪位好心人明白,就告诉我一下,给我留个言,或发个评论吧,先谢了。
### 三级标题:解决 error LNK2005: _DllMain@12 already defined in StudentInfoDLL.obj 当在构建 DLL 项目时,链接器报错 `error LNK2005: _DllMain@12 already defined`,通常表示 `DllMain` 函数被多次定义。此问题通常出现在 MFC DLL 项目中,当开发者手动定义了 `DllMain` 函数,而 MFC 的库文件(如 `mfcsXXd.lib`)也提供了默认实现时,导致链接冲突[^1]。 #### 使用 `#pragma comment(linker, "/include:__afxForceUSRDLL")` 强制链接器处理 MFC DLL 导出符号 MFC 提供了一种机制,通过在源文件中添加如下预处理指令,可以强制链接器包含必要的符号,从而避免 `DllMain` 的重复定义: ```cpp #ifdef _USRDLL #pragma comment(linker, "/include:__afxForceUSRDLL") #endif ``` 此代码应放置在 DLL 的主实现文件(如 `StudentInfoDLL.cpp`)中,确保链接器正确处理 MFC 的 DLL 导出符号[^4]。 #### 避免在 DLL 中手动定义 `DllMain` MFC DLL 项目默认由 MFC 提供 `DllMain` 实现,若开发者手动添加 `DllMain` 函数,则会导致重复定义错误。应删除手动定义的 `DllMain` 函数,并依赖 MFC 提供的默认实现。如果需要在 DLL 初始化或卸载时执行自定义逻辑,可以通过重写 `CWinApp::InitInstance` `CWinApp::ExitInstance` 方法实现[^3]。 #### 检查 MFC 链接方式与项目配置一致性 确保项目属性中“使用 MFC”选项与链接的 MFC 库版本一致。例如,若项目使用的是“在共享 DLL 中使用 MFC”,则链接的 MFC 库应为 `mfcsXXd.dll`(调试模式)或 `mfcsXX.dll`(发布模式)。不一致的配置会导致链接器错误,包括 `DllMain` 符号冲突[^1]。 #### 避免在扩展 DLL 中使用 `AFX_MANAGE_STATE(AfxGetStaticModuleState())` 在某些 MFC 扩展 DLL 场景中,若错误地使用了 `AFX_MANAGE_STATE(AfxGetStaticModuleState())`,可能会导致 `DllMain` 冲突。此宏用于管理模块状态,但在扩展 DLL 中不应使用,因为其内部逻辑与 MFC 默认的 DLL 初始化机制冲突[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值