GCC链接器抱怨对现有全局变量的未定义引用
GCC linker complains about undefined reference to existing global variable
我对GCC有问题。它找不到我的全局变量。我创建了一个示例C++项目来隔离这个问题:
a.cpp:
#include "b.h"
const char * const g_test = "blah blah";
int main(){
test();
return 0;
}
b.cpp:
#include <iostream>
#include "a.h"
using namespace std;
void test(){
cout << g_test;
}
a.h:
extern const char * const g_test;
b.h:
void test();
我这样编译它:
$ g++ -o a.o -c a.cpp
$ g++ -o b.o -c b.cpp
$ g++ -o test a.o b.o
b.o: In function `test()':
b.cpp:(.text+0x7): undefined reference to `g_test'
collect2: error: ld returned 1 exit status
在最后一个命令中更改对象文件的顺序不会改变任何内容。
链接器为什么抛出错误?我本来只想创建一个可执行文件来打印"废话",但不知怎么的,错误出现了。我看不出有什么理由会失败。
作为常量变量,g_test
只有内部链接,即只能在定义的.cpp文件中使用。为了给常量变量提供全局链接(即使其可从其他源文件中使用),您必须添加extern
关键字,即:
#include "b.h"
extern const char * const g_test = "blah blah";
int main(){
test();
return 0;
}
或者,您可以在开头包含a.h
。在这种情况下,编译器在翻译a.cpp
时已知extern
正向声明。
然而,最好的解决方案是将g_test
的定义(没有extern
关键字)移动到头文件中。原因是通过这种方式,编译器知道每个编译单元中g_test
的定义,并且例如能够在编译时使用它来计算常量表达式。
最简单的解决方案是在定义中添加关键字extern
。我知道这看起来很奇怪,extern
通常将其作为前向声明,而不是定义,但编译器仍然会将其视为定义(实例化),因为你给了它一个值。
昆汀评论中的链接(从昆汀那里偷来)是对原因的极好解释。
相关文章:
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 修改程序的入口点时未调用全局变量的构造函数
- QT C++中对全局变量的未定义引用
- 跨多个类的全局变量而不会出现重定义错误?
- 包括一个类来定义全局变量参数 c++ :(
- C++ 如何检查 char 变量是否未定义(未初始化)
- 为什么 mfc 中静态文本工具中的变量未定义
- 标头中的成员变量未定义
- 我的参数化构造函数说我的字符串变量未定义
- 如何管理多个文件、全局变量和定义
- 为什么当我通过引用传递数组时,我会收到一个编译器错误,指出我的变量未定义
- GCC链接器抱怨对现有全局变量的未定义引用
- 当 f & g 修改相同的全局变量时,表达式 f() 的值是否> g() 未定义或未指定?
- 多个源文件中的外部全局变量未解决的链接器错误
- 变量未定义错误
- 为什么在未命名的命名空间中声明变量后无法在全局范围内定义变量?
- 静态变量-未定义的引用
- R调用Cpp代码:全局变量未重新初始化
- 当异常变量未定义时,通过引用捕获
- VS2010 中全局变量的定义