【发布时间】:2010-05-28 20:49:51
【问题描述】:
我正在将一些旧版应用程序更新到 Visual Studio 10 并处于链接器地狱。所有这些 DLL 都从 CWinApp 派生类,并使用 AfxGetApp() 来访问对象。当我链接 DLL 时,我得到了看起来像全局静态对象的未解析外部对象,这些对象会被普通应用程序的 main() 拉入:
Shell.lib(SHELL.obj) : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CException::classCException" (?classCException@CException@@2UCRuntimeClass@@B)
Shell.lib(SHELL.obj) : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CFrameWnd::classCFrameWnd" (?classCFrameWnd@CFrameWnd@@2UCRuntimeClass@@B)
Shell.lib(SHELL.obj) : error LNK2001: unresolved external symbol "public: static class CRect const CFrameWnd::rectDefault" (?rectDefault@CFrameWnd@@2VCRect@@B)
我当前忽略默认库和附加库的组合(您可以轻松地通过谷歌找到链接器地狱的答案的方法)是:msvcprtd.lib,mfc100d.lib,mfcs100d.lib,libcmtd.lib
当我添加 nafxcwd.lib(mfc 库)时,这三个外部符号会解析,但我最终会得到一堆其他重复的符号(需要使用 /FORCE:MULTIPLE),最后 ___argc 和 ___argv 变得无法解析。
所以基本问题是:你能在 VS10 中链接一个包含 CWinApp 的 DLL 吗?你如何设置链接器来做到这一点?
【问题讨论】:
-
链接器抱怨的定义与 CWinApp 无关。 (例如,CException 在 DLL 中可以正常工作。)所以虽然我不知道您的问题是什么,但事实并非如此。
-
您是否有常规的 MFC DLL 项目或导出类的扩展 DLL?
-
该类未导出。这是一个 MFC DLL。它不是 MFC 应用程序。代码没有创建或修改任何窗口。它是 20 年前写的,今天人们承认他们不知道自己在做什么。这就是为什么我的问题是“您可以将应用程序类放入 DLL 中吗?”类本身只能从 DLL 中访问(使用 AfxGetApp() 和大量转换)。基本上,它被用作我们跟踪库的钩子,并作为将所有全局数据存储在单例类中的一种方式。我想要做的是摆脱 MFC 的东西,但我不想让它链接
标签: c++ visual-studio-2010 mfc winapi legacy