gpt4 book ai didi

c++ - LNK2005 already defined error on inclusion of C-type header file in C++ project [MSVC12]

转载 作者:行者123 更新时间:2023-11-28 05:46:43 27 4
gpt4 key购买 nike

我在尝试将一些第三方代码集成到我的项目中时遇到了障碍。我正在尝试集成 fontstash,这是一个仅包含标题的 OpenGL 文本呈现解决方案。 ( https://github.com/memononen/fontstash ) 总的来说,我还在使用 SDL、GLEW、AssImp、Lua 5.3/LuaBridge 和 Bullet Physics。我已将 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 头文件提供的整个函数列表。我试过将 header 包装在 extern "C"{} 中但无济于事。我也尝试过包含项目目录中的文件。我不知道为什么会发生这种情况以及从哪里开始找出导致这种情况的原因。如主题标题所示,我正在使用 MSVC12/Win7,并且我正在为 Windows 构建并为 x86 进行编译。

此外,我不止一次包含这些文件,因为在其他位置使用了使用 fontstash 的相关代码。我已经考虑过这是问题所在,但是 fontstash 提供的头文件有包含保护,所以我不明白为什么会在这方面发生。

最佳答案

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

关于c++ - LNK2005 already defined error on inclusion of C-type header file in C++ project [MSVC12],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36076489/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com