【问题标题】:Compiling with Extern variable in C++在 C++ 中使用外部变量进行编译
【发布时间】:2018-10-15 11:58:51
【问题描述】:

我有一个头文件:headerFiles.h 包含以下外部变量:

extern char *err_msg;
extern char recvbuf[DEFAULT_BUFLEN];
extern char sendbuf[DEFAULT_BUFLEN]; 

这个头文件包含在:Helper.h中,Helper.h包含在Helper.cpp中,所以,

headerFiles.h --> 包含在 --> Helper.h --> 包含在 --> Helper.cpp

但是当我在 Helper.cpp 文件中引用外部变量时,编译器会给出以下链接错误:

错误 LNK2001 无法解析外部符号“char * err_msg” (?err_msg@@3PADA)

我认为它可以通过命令行编译,但我想知道如何使用 Visual C++ 编译它。我有 VC++ 2017 社区版。 请帮忙。

【问题讨论】:

  • 您声明的变量,您是否在任何地方定义它们?在哪个源文件中?你是用那个源文件构建的吗?
  • @Some 程序员老兄,我在 HeaderfFles.h 中添加了三个外部变量,我的目的是将所有外部变量保存在一个位置(即在单独的头文件中)
  • a variable declaration that uses extern and has no initializer is not a definition. 这一行解决了一切。

标签: c++ visual-c++ extern


【解决方案1】:

来自here

extern 说明符只允许在变量和函数的声明中(类成员或函数参数除外)。它指定外部链接,并且在技术上不影响存储持续时间,但它不能用于自动存储持续时间对象的定义,因此所有外部对象都具有静态或线程持续时间。此外,使用 extern 且没有初始化器的变量声明不是定义。

换句话说,您的代码只是声明在某处定义了err_msg(和其他)变量(!),依靠链接器知道它在哪里。 这就是当无法找到请求的名称时会出现链接器错误的原因。

一种可能的解决方案是定义:

char *err_msg;
char recvbuf[DEFAULT_BUFLEN];
char sendbuf[DEFAULT_BUFLEN]; 

在您项目的一个(也是唯一一个)*.cpp 文件中。

【讨论】:

  • 感谢@John 的解释,--> 使用 extern 且没有初始化程序的变量声明不是定义。 extern char *err_msg=NULL; extern char recvbuf[DEFAULT_BUFLEN] = {0}; extern char sendbuf[DEFAULT_BUFLEN] = {0};
猜你喜欢
  • 2011-10-16
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2016-11-17
  • 2020-03-13
相关资源
最近更新 更多