首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LNK2005已经定义了在C++项目中包含C型头文件的错误[MSVC12]

LNK2005已经定义了在C++项目中包含C型头文件的错误[MSVC12]
EN

Stack Overflow用户
提问于 2016-03-18 05:00:47
回答 1查看 2K关注 0票数 0

我试图在我的项目中集成一些第三方代码时遇到了一个障碍。我正在尝试集成fontstash,这是一个只有头的OpenGL文本呈现解决方案。(https://github.com/memononen/fontstash)作为一个整体,我还使用SDL、GLEW、AssImp、Lua5.3/LuaBridge和子弹物理。我已经将fontstash头文件放置在vc/include目录中。编译工作正常进行,但是链接在一堵巨大的墙里不幸地失败了。

代码语言:javascript
复制
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提供的头文件有包含保护,所以我不明白为什么会出现这种情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-18 05:45:35

这是包含实现的头文件的一个常见问题。当您使用#include指令时,编译器只是插入.h文件内容而不是它。因此,当您在项目的不同位置使用此标头时,您将得到其方法和全局变量的几个相同的实现。因为它有#ifdef#pragma once编译器保护,所以它编译得很好。但是,当链接器试图将所有已编译的obj文件合并到一个可执行模块时,它会得到几个相同的实现。因为它不知道应该使用哪一个,所以会得到LNK2005错误。为了解决这个问题,您可以将实现和全局文件移动到单独的cpp文件中,并将其包含在项目中。其他方法是将所有标头函数标记为inline,或者使用__declspec(selectany)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36076489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档