gpt4 book ai didi

c++ - GCC 链接器提示对现有全局变量的 undefined reference

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:09 27 4
gpt4 key购买 nike

我对 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;
}

嗯:

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

在上一个命令中更改目标文件的顺序不会改变任何内容。

为什么链接器会抛出错误?我原以为只是创建一个可执行文件打印“blah blah”,但不知何故出现了错误。我看不出它应该失败的任何原因。

最佳答案

作为常量变量 g_test 只有内部链接,即只能在它定义的 .cpp 文件中使用。为了给一个 const 变量全局链接(即使其可从其他源文件使用),您必须添加 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 的定义,例如能够在编译时使用它评估 const 表达式。

关于c++ - GCC 链接器提示对现有全局变量的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36984858/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com