2009-06-24 75 views
6

我gettings这些类型的错误,在MFC VS6项目,同时链接应用程序:如何避免C“已经定义的错误” ++

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

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

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

有没有办法告诉我想使用的功能_atoimsvcrt.liblibc.lib,而不是连接(或者反过来)?

任何帮助或方向将是伟大的。

回答

1

好像有,你可以用忽略这样的错误的选项:在projectsettings>链接>选中“强制文件输出”。即使有链接器,这也会生成程序。

生成输出给这样的事情:

MSVCRT.LIB(MSVCRT.dll的):警告LNK4006:_atoi在LIBC.LIB(atox.obj)已经定义;第二个定义忽略

当然,你将需要使用此选项时请小心,因为它可以产生,不会在某些情况下工作的应用程序,但在这里它可能不会做任何伤害(我希望)。

谢谢你的其他答复,但这似乎没有在我的具体情况下的选择。

11

这个错误当然意味着你链接了使用不同运行时库编译的两段代码。 MSVCRT.dll是动态版本,而LIBC.lib是静态版本。如果你这样做,所有的地狱都会破裂。尝试查找代码的哪些部分使用哪个版本,并将其排除。

+1

只是有类似的问题,因为我没有太多熟悉的不可控制的世界,这是一个有点意外,我认为你可能需要不同的版本,根据第三方库在其运行时库代码和库使用。我下载了一个第三方lib和试图将它在VC++ 2005中有一个项目链接原来使用的库和旧版本的(一个?)运行时库 - LIBCP.LIB。幸运的是第三方库的源代码可用,所以我可以用VC2005运行时库来补充它。不知道如何解决这个问题,如果没有源代码。 – axk 2009-12-18 22:35:24

4

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

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

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

+1

libc是单线程静态的。 libcmt是多线程静态的。 msvcrt是一个DLL和多线程。 libc在当前的MSVC版本中不再可用。 – MSalters 2009-06-24 08:37:30