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文件。
原文地址:https://www.cnblogs.com/San-Francisco/p/16001766.html
- 一个 android 的框架
- Spring Cloud实战小贴士:Ribbon的饥饿加载(eager-load)模式
- android常用接口(二)
- Spring Cloud实战小贴士:Zuul的饥饿加载(eager-load)使用
- RxAndroid完全教程
- 全能型反汇编引擎 – Capstone-Engine
- Hijack攻击揭秘
- 都在说微服务,那么微服务的反模式和陷阱是什么(二)
- Spring Boot 2.0 - WebFlux framework
- Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】
- SpringCloud实战小贴士:Zuul的路径匹配
- 程序员你为什么这么累【续】:编码习惯之参数校验和国际化规范
- 程序员你为什么这么累【续】:编码习惯-函数编写建议
- 那些年,我们一起碰到过的骗局
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Arrays 的二分查找
- (四十四)golang--协程(goroutine)和管道(channel)相结合实例
- 基于maven+ssm的增删改查之测试相关ssm环境是否成功
- 基于maven+ssm的增删改查之带分页的显示员工相关信息(基于bootstrap)
- (四十五)golang--反射
- 基于maven+ssm的增删改查之前后端之间使用json进行交互(显示员工信息)
- 动态规划--矿工挖矿
- 基于maven+ssm的增删改查之添加员工实现
- MyBatis 构造动态 SQL 语句
- 基于maven+ssm的增删改查之前端校验数据合法性
- 基于maven+ssm的增删改查之spring+springmvc+mybatis环境搭建
- STS 创建 Maven 项目填坑
- latex之在windows环境下能够在latex中使用中文
- 在 Web 中获取 MAC 地址
- 基于maven+ssm的增删改查之ajax校验用户名是否可用