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.h
和graphics_app.cpp
文件添加到项目和项目目录中:
#include "graphics_app.h"
不会出错。
所以我做了更简单的版本,但同样的问题重复了。
一个文件只包含空的main
和#include <graphics_app.h>
行会产生同样的错误。因为那个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:在单个文件上运行自定义构建工具时指定工作目录