从 AfxGetAppModuleState 更改为 AfxGetStaticModuleState 会导致链接器错误:LNK1169:找到一个或多个多重定义的符号
Posted
技术标签:
【中文标题】从 AfxGetAppModuleState 更改为 AfxGetStaticModuleState 会导致链接器错误:LNK1169:找到一个或多个多重定义的符号【英文标题】:Changing from AfxGetAppModuleState to AfxGetStaticModuleState gives linker error: LNK1169: one or more multiply defined symbols found 【发布时间】:2015-12-02 08:16:38 【问题描述】:我有一个具有“在共享 DLL 中使用 MFC”属性的 dll 模块。我希望在所有可以从外部调用的公共方法的开头都应该有
AFX_MANAGE_STATE(AfxGetStaticModuleState());
但在代码中,我发现它们有
AFX_MANAGE_STATE(AfxGetAppModuleState());
目前我们正面临一些应用程序崩溃和访问冲突。我怀疑这可能是一种可能性,因此我尝试更改其中一种方法来调用 AfxGetStaticModuleState 而不是 AfxGetAppModuleState。 我开始收到链接器错误
LNK1169: one or more multiply defined symbols found
我不明白为什么这个错误会导致这个变化! 请帮忙
添加调用栈:
1b0b2ce1()
msvbvm60.dll!7299ce49()
[Frames below may be incorrect and/or missing, no symbols loaded for msvbvm60.dll]
msvbvm60.dll!7299f97d()
user32.dll!764bc4e7()
user32.dll!764bc5e7()
user32.dll!764bc590()
user32.dll!764b4f0e()
user32.dll!764afe58()
user32.dll!764b4f7d()
ntdll.dll!777a702e()
user32.dll!764b4ec3()
user32.dll!764ab300()
msvbvm60.dll!7295f45a()
msvbvm60.dll!7295f9bd()
msvbvm60.dll!72941b31()
ntdll.dll!777b89d8()
ntdll.dll!7778f731()
ntdll.dll!777a60b4()
ntdll.dll!7778f632()
msvcr110d.dll!_endthreadex(unsigned int retcode) Line 410 C
mfc110d.dll!AfxEndThread(unsigned int nExitCode, int bDelete) Line 388 + 0xc bytes C++
mfc110d.dll!_AfxThreadEntry(void * pParam) Line 129 C++
msvcr110d.dll!_callthreadstartex() Line 354 + 0xf bytes C
msvcr110d.dll!_threadstartex(void * ptd) Line 337 C
kernel32.dll!7621ed6c()
ntdll.dll!777c37eb()
ntdll.dll!777c37be()
【问题讨论】:
向我们提供有关调用堆栈内容和崩溃位置的更多信息。 如您所见:您没有涉及任何 DLL 代码。即使您没有执行任何代码。好的。您可能会以非常严厉的方式破坏堆栈。但即使你应该能够调试它。因此,如果有错误,您会以某种方式破坏堆栈或堆。所以不存在导致崩溃的直接“编码错误”。 【参考方案1】:关于链接器错误:对于 DLL,AfxGetAppModuleState 是错误的。
请阅读:https://msdn.microsoft.com/library/jj129660(v=vs.100).aspx
这会将当前模块状态与从返回的状态交换 AfxGetAppModuleState 直到当前作用域结束。
要从 DLL 函数设置或恢复模块状态,不要使用 AfxGetAppModuleState。相反,请使用 AfxGetStaticModuleState。
有关模块状态和 MFC 的更多信息,请参阅管理状态 MFC 模块在创建新文档、窗口和视图中的数据和 技术说明 58。
只要您不向我们提供有关调用堆栈和崩溃位置的更多信息,我就无法告诉您有关崩溃原因的任何信息。
【讨论】:
嗨,在 DLL 中使用AfxGetStaticModuleState
时出现链接问题,当我用 AfxGetAppModuleState
替换它们时,它们就消失了。 jeffpar.github.io/kbarchive/kb/161/Q161589【参考方案2】:
问题主要是链接器错误,而不是 AfxGetAppModuleState 或 AfxGetStaticModuleState 本身。抱歉,如果我问的问题有任何混淆。 当符号在该模块引用的另一个模块中定义或声明具有 MFC 和非 MFC 的头文件的顺序时,会发生此链接器错误。 通过组织标题来解决这个问题对我来说是一个艰难的时期。我不得不把这个任务放在一边,以便我可以在空闲时间再次选择它!
【讨论】:
以上是关于从 AfxGetAppModuleState 更改为 AfxGetStaticModuleState 会导致链接器错误:LNK1169:找到一个或多个多重定义的符号的主要内容,如果未能解决你的问题,请参考以下文章
当从不同的类调用更改时,UIView IBOutlet 不会更改
更改 ListBox 选择不会将更改从 BindingSource 移动到 DataSet
为啥从内部组件中更改 @Input 变量会导致它无法检测到来自外部组件的新更改?