1

我在将一个非常旧的 Visual Studio 97 C++ 项目移植到 Visual Studio 2010 时遇到了一些真正的困难。让我首先介绍一下在这个新的 LNK1224 错误之前我遇到的错误的一些背景,因为它们可能是相关的,但是我不知道。

在我出现新错误之前,我收到了这个错误:

error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj)  nafxcw.lib(afxmem.obj)

通过一些挖掘,我发现这个错误的原因是因为 MFC 和 CRT 库都包含“new”和“delete”的定义,所以它们发生了冲突。微软为此提供了 2 个解决方案,详见http://support.microsoft.com/kb/q148652/。其中之一是确保在所有文件中始终首先包含 MFC 标头(afx 内容)。好吧,这个项目中有大约 100 个文件,我只是厌倦了试图找到包含错误顺序的资源的文件。所以我选择了另一个解决方案,它基本上是强制库以特定顺序加载。基本上,您必须告诉编译器忽略特定库,以便您可以按照您选择的顺序显式加载它。就我而言,它是 nafxcw.lib。

因此,在项目属性 --> 链接器 --> 输入下,我明确忽略了 nafxcw.lib,然后将其明确包含在列表的前面。

属性窗口

所以在这样做之后,我的 LNK2005 错误就消失了。但是它们被一个单一的链接错误所取代。

error LNK1224: invalid image base 0x287600000

我不知道我是否正确修复了以前的链接错误,而这个新的链接错误实际上是我接下来要处理的事情,或者我只是创建了一个更严重的链接错误,它基本上在链接过程到达之前停止了它我原来的 LNK2005 错误。无论哪种情况,我都找不到关于此错误的太多信息。微软在这个链接中没有说太多关于它http://msdn.microsoft.com/en-us/library/3ya3f8wz%28v=vs.80%29.aspx

您为图像指定了无效的基地址。基地址必须是 64KB 对齐的(最后四个十六进制数字必须为零),并且映像基址必须适合 32 位有符号或无符号值。

这对我来说并不是那么有帮助,而且似乎没有其他线索可以说明这个问题的来源。我不知道下一步是什么。

4

1 回答 1

0

好的,所以看起来我已经解决了我自己的问题。这就是我所做的。我需要知道这个数字到底是从哪里来的,所以我简单地使用 Notepad++ 在所有项目文件中进行单词搜索,寻找“2876”,这是我从错误消息“LINK:致命错误 LNK1224:无效图像库 0x287600000”中得到的”。我发现在项目文件(.vcxproj)中有以下条目:

<BaseAddress>0x287600000</BaseAddress>

所以我打开它,坐在那里想知道这个数字怎么错了。我的意思是我什至不知道这个领域是干什么用的。我什至没有生成这个文件,M$ 做到了。为什么 IDE 会错误地创建它自己的输入文件?无论如何,当我试图用谷歌搜索这个“BaseAddress”项目以找出它是什么时,我突然意识到它看起来有太多的零。所以我回去数了数,果然,这不是一个 32 位的数字,而是一个 36 位的数字。删除了一个零,重新编译,然后成功了。低,看,这就是我在问题陈述中提到的定义,暗示早些时候在 MSDN 上查找过,但它没有点击。

我不习惯经常翻阅自动生成的文件,所以我从不怀疑这可能是问题所在。

于 2011-08-26T16:44:27.407 回答