Visual Studio 自定义包含路径在链接时导致符号错误

Posted

技术标签:

【中文标题】Visual Studio 自定义包含路径在链接时导致符号错误【英文标题】:Visual Studio custom include path makes symbol error when linking 【发布时间】:2018-01-26 19:06:18 【问题描述】:

我有添加到项目属性的自定义包含目录。

以前的问题:C++ linker strange behavior: static member variable

当我将 .h 和 .cpp 文件放入项目和项目目录时,完全没有问题。 但是当我尝试在自定义包含路径中使用相同的文件时,会出现LNK2005 链接器错误——尤其是具有static 成员的类。

这是我的代码:

/* graphics_app.h */
#ifndef DK_GRAPHICS_APP_H
#define DK_GRAPHICS_APP_H
...    
class GraphicsApp 
private:
    static GraphicsApp* self;

public:
    ...

#endif /* DK_GRAPHICS_APP_H */

/* graphics_app.cpp */
#include "graphics_app.h"
...
GraphicsApp* GraphicsApp::self = nullptr;

当我尝试在这样的项目中使用时:

#include <dk\graphics_app.h>

我收到这些链接器错误(请注意,我使用的是 MSVC)

LNK2005 "private: static class GraphicsApp * GraphicsApp::self" (?self@GraphicsApp@@0PEAV1@EA) already defined in main.obj.
LNK1169 one or more multiply defined symbols found.

但是,如果我像这样将graphics_app.hgraphics_app.cpp 文件添加到项目和项目目录中:

#include "graphics_app.h"

不会出错。

所以我做了更简单的版本,但同样的问题重复了。 一个文件只包含空的main#include &lt;graphics_app.h&gt; 行会产生同样的错误。因为那个static

我错过了什么?

【问题讨论】:

问题很可能不是头文件,而是源文件。您是否多次使用它进行构建? 是的,我尝试使用只有静态成员的类,并包含在 just-empty-main() 代码中。但是当我使用它时,会出现同样的错误——因为 static 已经定义了成员符号。 这个错误直到昨天才出现。即使我将静态成员定义放在 .h 文件中 你的 main 正在以某种方式实例化 self。 (GraphicsApp* GraphicsApp::self;) 要么你正在这样做,要么你正在包含一个标题(甚至是 cpp?)。 偏执的方法是你可以做一个项目->清理,然后'在文件中查找'(可能是 ctrl-shift-f),Look in 并选择你的项目的根目录目录(以便它包含您的包含目录),查看所有文件类型 (*.*),然后找到 GraphicsApp::self。您应该只能在一个文件中看到它:graphics_app.cpp。如果你有多个该文件的副本,那就麻烦了。 【参考方案1】:

包含路径被误解了。

包含路径仅定位 .h 文件。因此,与使用标准头文件或第 3 方头文件不同,我制作的头文件知道 decleration 功能等。

包含路径无法定位.cpp文件,因为它是包含路径。所以我要做的就是做一个库或者单头。

我没有制作库,而是选择了这种方法:将定义部分(.cpp)文件添加到项目中。

我有了概念。感谢回复!

【讨论】:

以上是关于Visual Studio 自定义包含路径在链接时导致符号错误的主要内容,如果未能解决你的问题,请参考以下文章

依赖项更改时 Visual Studio 运行自定义构建工具

在Visual Studio Designer中找不到自定义字体的C#文件

Visual Studio 2010:在单个文件上运行自定义构建工具时指定工作目录

MFC:如何将自定义控件包含到 Visual Studio 的工具箱中

Visual Studio 2019设置自定义头部注释

未加载符号文件以在 Visual Studio 2012 中调试自定义项目