首页 > 解决方案 > C++ LNK2001 尝试使用外部变量时出错

问题描述

我正在尝试创建一个实用程序类,我可以彻底使用我的程序,如日志记录、调试等。

在 Java 中,我知道我可以通过声明变量和函数来做到这一点static,当我阅读更多如何在 C++ 中做到这一点时,我应该使用extern,并被命名空间包围,以免填充太多文件。在尝试初始化这些外部变量时,在构造函数类中,我收到以下错误:

application.cpp.obj:错误 LNK2001:未解析的外部符号“类 Application * Lib::app”

application.cpp.obj:错误 LNK2001:未解析的外部符号“类 Graphics * Lib::graphics”

哪个对我来说没什么意义,但存在链接问题?我有以下2个文件:

// lib.h
#ifndef LIB_H
#define LIB_H

#include "graphics.h"
#include "application.h"

namespace Lib {
    extern Application *app;
    extern Graphics *graphics;
}

#endif //LIB_H


// application.cpp
#include "include/application.h"
#include "include/lib.h"
.
Application::Application(Listener* listener, Configuration* config, Graphics* graphics) {
    .
    .
    // Our library for graphics
    this->graphics = graphics;
    .
    .
    // creating the environment utils
    Lib::app = this;
    Lib::graphics = graphics;
    .
    .
}

标签: c++linkernamespacesexternlnk2001

解决方案


extern意味着您在其他地方定义变量。在您的情况下,您必须在 lib.cpp 中包含以下内容:

namespace Lib {
    Application *app;
    Graphics *graphics;
}

也就是说,你的设计是有问题的:

在 Java 中,我知道我可以通过将变量和函数声明为静态来实现

你可以在 C++ 中做同样的事情,在这种情况下会更有意义。


推荐阅读