如何避免C ++中的“已定义的错误”

时间:2009-06-24 08:17:11

标签: c++ linker visual-studio-6

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

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

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

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

有没有办法告诉链接器我想使用_atoi中的libc.lib功能而不是msvcrt.lib(或其他方式)?

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

3 个答案:

答案 0 :(得分:11)

此错误当然意味着您要链接使用不同运行时库编译的两段代码。 MSVCRT.dll是动态版本,而LIBC.lib是静态版本。如果你这样做,那么一切都会破裂。尝试查找代码的哪些部分使用哪个版本,然后对其进行排序。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

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

Build输出提供如下内容:

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

当然你需要小心使用这个选项,因为它可以生成一个在某些情况下不起作用的应用程序,但在这里它可能没有任何伤害(我希望)。

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