在Visual Studio Code中完成Bjarne Stroustrup著作第八章练习时,链接C++头文件出现函数未定义引用错误
解决 "undefined reference to 'print_foo'、undefined reference to 'print(int)'" 链接错误
嘿,我一眼就看出你这问题出在哪了——这是典型的链接阶段错误,不是代码语法有问题,而是你没把所有需要的源文件都拉进编译流程,另外还有个变量作用域的小坑,咱们一步步来搞定:
1. 先搞定链接错误的核心问题
你现在有三个文件:my.h(头文件)、my.cpp(函数实现)、use.cpp(主程序)。编译器编译use.cpp的时候,只从my.h里知道print_foo和print(int)的声明,但找不到它们的具体实现代码(这些代码都在my.cpp里呢)。所以你必须把两个源文件一起编译,不能只单独编译use.cpp。
- 如果你用g++命令行编译,正确的命令应该是:
这样g++会同时编译两个g++ use.cpp my.cpp -o my_program.cpp文件,然后把它们链接成一个可执行文件my_program。 - 如果你在VS Code里用默认的编译任务,得修改
.vscode/tasks.json,把my.cpp也加到编译的源文件列表里。比如在args数组里加上"${workspaceFolder}/my.cpp",确保任务会同时处理两个源文件。
2. 修复foo变量的作用域问题
你在use.cpp的main函数里定义的int foo =7;是局部变量,而my.h里声明的extern int foo要找的是全局作用域的foo。这会导致print_foo()运行时,打印的是一个未初始化的全局变量值(随机垃圾值),可不是你想要的7。
把foo的定义移到main外面,改成全局变量就行:
#include<iostream> #include"my.h" using namespace std; int foo =7; // 移到全局作用域,让extern能找到它 inline void keep_window_open() {char cc;cin>>cc;} int main() { print_foo(); print(99); return 0; }
最后验证
按照上面的步骤修改后,重新编译运行,你就能看到正确的输出:
foo =7 i =99
内容的提问来源于stack exchange,提问作者MurDoc HoøBs
相关产品推荐
相关产品推荐

