c++链接器错误LNK2005已经在SDL中定义

Posted

技术标签:

【中文标题】c++链接器错误LNK2005已经在SDL中定义【英文标题】:c++ linker error LNK2005 already defined in SDL 【发布时间】:2016-08-31 14:29:34 【问题描述】:

我正在使用 VS2005 编译我的程序。我正在链接到 SDL 静态库并收到以下链接器错误;

1>LIBCMTD.lib(fpinit.obj) : error LNK2005: __fltused already defined in SDL2d.lib(SDL_stdlib.obj)
1>LIBCMTD.lib(ftol2.obj) : error LNK2005: __ftol2_sse already defined in SDL2d.lib(SDL_stdlib.obj)
1>   Creating library ..\..\..\product\VS2005\libs\\Standalone.lib and object ..\..\..\product\VS2005\libs\\Standalone.exp
1>..\..\..\product\VS2005\libs\\Standalone.exe : fatal error LNK1169: one or more multiply defined symbols found

我使用相同的 VS2005 编译器编译了 SDL2d.lib。我最初的想法是这些项目的运行时库设置不匹配。但是在检查后它们都设置为多线程调试。

我刚刚注意到上面的链接器输出似乎在创建 Standalone.exe 之前创建了 Standalone.lib 和 Standalone.exp。我不知道它为什么要制作 .lib 和 .exp

出现此错误的任何其他原因?

谢谢

【问题讨论】:

这意味着您正在使用超过 1 个运行时。在这里,您似乎在同一个应用程序中混合了 Debug 和 Release。 LIBCMTD.lib 是调试 CRT 的一部分。 LIBCMT.lib 是发布 CRT 的一部分。如果您正在构建 Debug 应用程序,请确保不要使用 Release libs 和 viseversa。 “但是在检查后它们都设置为多线程调试。” 这不可能是正确的。如果是,您将链接到问题中未提及的另一个库。链接器错误非常清楚地表明冲突库是LIBCMT,这是发布版本。 谢谢,很遗憾我的报价有误。我已经编辑了问题并将 LIBCMT.lib 替换为 LIBCMTD.lib。链接器输出没有提到 LIBCMT.lib,只是在我的复制和粘贴过程中不知何故丢失了。抱歉,问题已编辑 编辑只修复了一处。输出还显示:defaultlib 'LIBCMT' conflicts with use of other libs... 您显然仍在尝试链接针对两个不同版本 CRT 的目标文件。您的一个或多个项目设置必须不正确,或者必须涉及您没有告诉我们的其他库(并且尚未重建)。这里没有足够的信息来提供任何进一步的帮助。这不是 Visual Studio 中的错误。我已经在 VS 2005 中成功编译并链接了许多项目。 【参考方案1】:

需要在 SDL 项目中定义 HAVE_LIBC。这停止了​​ _ftlused 和 _ftol2_sse 的多重重新定义

【讨论】:

默认情况下在 SDL 标头中定义。除非您之前编辑它们以删除定义,否则这应该不是必需的。 SDL_config_winrt.h 确实定义了HAVE_LIBC... 但我想知道有多少人使用它? ;) 无论出于何种原因,SDL 2.04 和 SDL 2.05 似乎都没有设置它。但是在使用 cmake 时,您可以在 cmake 命令行上指定 -DLIBC=ON 以创建一个包含 #define HAVE_LIBC 1 的 SDL_config.h。对我来说,这只是 x86 构建的一个问题。

以上是关于c++链接器错误LNK2005已经在SDL中定义的主要内容,如果未能解决你的问题,请参考以下文章

链接:致命错误 LNK1104:无法打开文件“SDL.lib”

VS2008(C++)-控制台项目中LNK2005错误的问题

error:LNK2005 已经在*.obj中定义

2>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _calloc 已经在 LIBCMTD.lib(dbgcalloc.obj) 中定义(示例代码

关于LNK2005的错误

错误:链接:致命错误 LNK1561:入口点必须定义 C++