【发布时间】:2018-01-26 19:06:18
【问题描述】:
我有添加到项目属性的自定义包含目录。
当我将 .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。如果你有多个该文件的副本,那就麻烦了。
标签: c++ visual-studio linker