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文件。