6

链接应用程序时,我在 MFC VS6 项目中遇到这些类型的错误:

msvcrt.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in LIBC.lib(atox.obj)

我知道这意味着什么(一个函数存在于 2 个不同的库中);要解决它,我应该排除 2 个库之一(msvcrt.liblibc.lib)。

但如果我这样做,就会出现各种未解决的外部错误。所以我想继续使用这两个库。

有什么方法可以告诉链接器我想使用_atoi函数libc.lib而不是msvcrt.lib(或相反)?

任何帮助或方向都会很棒。

4

3 回答 3

11

此错误肯定意味着您正在链接使用不同运行时库编译的两段代码。MSVCRT.dll 是动态版本,而 LIBC.lib 是静态版本。如果你这样做,所有的地狱都会崩溃。尝试找出代码的哪些部分使用了哪个版本,然后对其进行排序。

于 2009-06-24T08:23:47.350 回答
4

你有一个运行时冲突。使用多个运行时库通常是一件坏事。

您可以在链接器选项中使用 /nodefaultlib:msvcrt(或 /nodefaultlib:libc)来排除其中一个。

实际上,在使用之前,请检查您的项目设置。如果我没记错的话,libc 是 VS6 中的单线程运行时,而 msvcrt 是多线程运行时。如果您的解决方案中有多个项目,请确保它们都在使用其中一个。

于 2009-06-24T08:28:43.240 回答
1

似乎有一个选项可以用来忽略这样的错误:在 projectsettings > link > 检查“强制文件输出”。即使存在链接错误,这也会生成程序。

构建输出给出如下内容:

msvcrt.lib(MSVCRT.dll) : 警告 LNK4006: _atoi 已在 LIBC.lib(atox.obj) 中定义;第二个定义被忽略

当然,您需要谨慎使用此选项,因为它可能会生成在某些情况下不起作用的应用程序,但在这里它可能不会造成任何伤害(我希望)。

感谢您的其他回复,但在我的特殊情况下,这似乎不是一个选择。

于 2009-06-24T09:02:15.213 回答