vscode中使用extern关键字出现undefined reference to的问题

在按照c++ pp page255,尝试在一个cpp文件(翻译单元)中定义具有外部链接性的静态变量int x = 1,在另一个cpp文件中用 extern int x;引用声明时,运行会出现undefined reference to 'x'的错误。

两个文件分别如下:

接着F5编译,出现:

这时候,我们排查错误应该看最下面控制台中的红框中的问题。

解决该问题,参考

https://blog.csdn.net/squall0984/article/details/107637986

https://blog.csdn.net/weixin_45514968/article/details/119153141

可以看出有两个解决方法,本文不下载code-runner插件,而采用第一篇文章的方法。

问题的原因是vscode默认只能单文件编译,因此在编译 hello1.cpp时,并未编译hello.cpp。

在tasks.json中修改:

tasks.json文件中的args参数,实际上就是调用gcc时,后面所跟的参数在初始的配置中,实际上编译器执行的命令为gcc -g main.c -o main.exe,而修改后的配置中,执行的命令是gcc -g main.c hello.c -o main.exe,这是由于参数${file}代表的是被编译的当前文件,而参数${fileDirname}\\*.cpp代表的是当前目录下的所有.cpp文件。
因此这样修改之后,当前目录下所有的cpp文件都会被编译;

修改好后运行,如下图所示:

其中要注意的是,特意把hello.cpp和hello1.cpp单独放在了externtest2的目录下,这是因为如果放到有别的cpp文件的目录下,会将这些cpp文件也一起编译,这就会导致不同cpp文件中的main()函数等发生冲突,如我们在hello.cpp中也加上main()函数:

接着编译hello.cpp:

可以看到报错,在hello1.cpp中重复定义了main()函数,main()函数在hello.cpp中就进行了第一次定义。

因此,在运行有多个cpp文件的目录中的cpp文件时,还是将tasks.json中的配置改回来;在需要写有关外部引用的程序时,需要单独建立目录来存放cpp文件。

posted @ 2022-03-13 21:00  SanFranciscoo  阅读(4081)  评论(0编辑  收藏  举报