我试图在我的项目中集成一些第三方代码时遇到了一个障碍。我正在尝试集成fontstash,这是一个只有头的OpenGL文本呈现解决方案。(https://github.com/memononen/fontstash)作为一个整体,我还使用SDL、GLEW、AssImp、Lua5.3/LuaBridge和子弹物理。我已经将fontstash头文件放置在vc/include目录中。编译工作正常进行,但是链接在一堵巨大的墙里不幸地失败了。
c_main.obj : error LNK2005: "unsigned int __cdecl glfonsRGBA(unsigned char,unsigned char,unsigned char,unsigned char)" (?glfonsRGBA@@YAIEEEE@Z) already defined...
c_main.obj : error LNK2005: "void __cdecl glfonsDelete(struct FONScontext *)" (?glfonsDelete@@YAXPAUFONScontext@@@Z) already defined in...
...
c_main.obj : error LNK2005: _stbtt_FindMatchingFont already defined in...
c_main.obj : error LNK2005: _stbtt_GetFontNameString already defined...它似乎只是迭代了通过fontstash头文件提供的整个函数列表。我尝试过将标题包装在外挂的"C“{}中,但没有结果。我也尝试过包括项目目录中的文件。我不知道为什么会发生这种事,从哪里开始弄清楚是什么原因造成的。如主题标题所示,我正在使用MSVC12 12/Win7 7,我正在为Windows构建并为x86编译。
此外,我不止一次地包含这些文件,因为在其他位置使用了使用fontstash的相关代码。我已经考虑过这个问题,但是fontstash提供的头文件有包含保护,所以我不明白为什么会出现这种情况。
发布于 2016-03-18 05:45:35
这是包含实现的头文件的一个常见问题。当您使用#include指令时,编译器只是插入.h文件内容而不是它。因此,当您在项目的不同位置使用此标头时,您将得到其方法和全局变量的几个相同的实现。因为它有#ifdef或#pragma once编译器保护,所以它编译得很好。但是,当链接器试图将所有已编译的obj文件合并到一个可执行模块时,它会得到几个相同的实现。因为它不知道应该使用哪一个,所以会得到LNK2005错误。为了解决这个问题,您可以将实现和全局文件移动到单独的cpp文件中,并将其包含在项目中。其他方法是将所有标头函数标记为inline,或者使用__declspec(selectany)
https://stackoverflow.com/questions/36076489
复制相似问题