从 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 变量会导致它无法检测到来自外部组件的新更改?

即使在 Android 中更改后,通知声音也不会从默认值更改

sh 从远程分支拉取更改而不覆盖本地更改