c++ - 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;
.
.
}
解决方案
extern
意味着您在其他地方定义变量。在您的情况下,您必须在 lib.cpp 中包含以下内容:
namespace Lib {
Application *app;
Graphics *graphics;
}
也就是说,你的设计是有问题的:
在 Java 中,我知道我可以通过将变量和函数声明为静态来实现
你可以在 C++ 中做同样的事情,在这种情况下会更有意义。
推荐阅读
- deep-learning - 具有点击流的电子商务数据集
- java - BigInteger 类的 toString() 方法是如何工作的?
- android - 致命异常:java.lang.VerifyError 验证器由于方法错误 DataBinderMapperImpl.internalGetViewDataBinding 而被拒绝类
- visual-studio - Visual Studio 的 CentOS 8.1 服务器上的奇怪键映射
- node.js - Xpath:在 Devtools 中工作,但使用 document.evaluate() 返回空对象
- java - Android Studio 上的 Flutter - Intellisense 无法正常工作
- google-apis-explorer - 在 Apps 脚本中启动查询时响应太大而无法在 BigQuery 中返回
- botframework - TypeError:词汇表不包含 UNK 标记
- python - 如何在类方法装饰器的 self 参数中添加类型注释?
- java - 一致的崩溃 Android - 播放计费