WSL VSCode运行C++项目

本文按照出错信息进行展开。

collect2: error: ld returned 1 exit status

在这里插入图片描述

其实这个问题是上面有很多其他的问题:
在这里插入图片描述
所以其实是boost库的依赖问题,这几个库要链接;

boost库的链接

首先是自己boost库最开始的安装就有问题,所以这里重新安装了一下。

安装并编译boost库:

在Ubuntu上安装Boost的五种方法(全网最全,建议收藏)
使用第二种方法安装。

注意:

  1. 下载压缩包时,使用powershell,
    在这里插入图片描述
    $前 就是当前路径,~ 表示当前用户的home
    所以下载完之后再home文件夹中。
  2. 编译之后,boost文件夹就会加入到包含搜索路径了
    在这里插入图片描述

链接库(!!这一步有错误,下面会改正)

这样,再在task.json中,添加以下两句即可:
在这里插入图片描述
这样就解决了这两个问题。
-L 就是g++ 链接指令参数

不过这里有错误,就是-L下面这一行要分开写,不能这么写,下面这么写才是对的,所以VSCode不太智能,还是CMake比较好hhh。(具体报错下面会写道)
在这里插入图片描述

/usr/include/boost/python/detail/wrap_python.hpp:57:11: fatal error: pyconfig.h: No such file or directory

在这里插入图片描述

这其实是,这几个文件的路径,没有包含在环境变量中,所以编译器找不到,尝试了很久,最后就是直接搜索几个文件,然后把这个文件的路径,放到task.json中。

.hpp是对.h的包装。
对于cl.h文件的缺失,在powershell运行这条命令,就可以。注意,不是哪里输命令就装哪里的,应该是装到一个公用的地方

sudo apt-get install opencl-headers

不过其实本地是有的,只要搜索一下文件位置,然后放到task.json中即可:
在这里插入图片描述

file format not recognized

在这里插入图片描述
从这里的报错信息来看,ld,说明是链接器报错,应该是链接脚本出错了
这里其实是两个问题。

gch文件

在这里插入图片描述
是静态链接和动态链接的问题,gch是预编译头,不小心把.h也编译了,就出现了gch文件。那么找到路径,翻到最后发现有这么多gch文件,这已经不知道下午3点多,编译的时候干了啥,蜜汁操作给自己编译出了这么多.gch文件。把所有的gch文件删除之后,就可以了。

所以,实在解决不了,就去看看路径下面,仔细翻翻文件是什么样的
加粗样式

boost链接错误

上面修改完最后一个错误之后,现在报了更多错误,但是之前是两种错误,现在只有一种,赢!!!(lol)
在这里插入图片描述
那么通过分析最终的编译命令,如下图

其实按理说,应该是自己写g++的编译命令,这样更不容易出错,因为是刚开始,所以就用F5直接运行,在powershell会自动弹出使用的编译命令,这里的编译命令中使用的参数,其实就是task.json中配置的args参数,所以task.json要配置好,这里出错也是因为task.json的问题

在这里插入图片描述
在这里插入图片描述
发现这里链接的命令出错了,这几个应该是分成多个引号的,现在
在这里插入图片描述
这几个-l被包含在了同一对 “ ” 中,所以错了。只需要如下修改即可:
在这里插入图片描述
vscode太不智能了,cmake都是写一行的。

task.json文件中-g参数包含文件问题

在这里插入图片描述
在这里插入图片描述
可以看到,这个工程中还有两个cpp文件。而在下面的task.json文件中,-g参数也就是调试参数,只使用了一个参数,“${file}”,代表当前活动窗口,也就是我们要在运行的时候,点到最上层的top.cpp才能运行,但是这样就没有包含进上面的两个cpp,于是可以把这两个文件添加进来,直接下一行添加即可,不需要再次写“-g”。
在这里插入图片描述
添加完之后又报错,

因为之前把几个程序中错误给改了,现在只有最后一个错误了,
在这里插入图片描述
c++20新语法,解决起来相当复杂。

最后发现问题是在这里:

我们观察到,官方文件SConstruct这个脚本文件中,只包含了这两个cpp,如下图,另外一个cpp是没有包含进来的,所以我们可以在-g参数中除去第三个文件。
在这里插入图片描述
在这里插入图片描述
如上修改,即可以了。

所以要学会看官方的文档,以及文档目录

这里修改的-g参数,是make_shared参数,和内存分配有关,然后这里的这个报错,就是跟allocator相关,allocator是内存分配器
在这里插入图片描述

所以,第三个cpp文件,是多余的,官方忘记删了,不删掉问题就大了,反正不要一起编译,估计是api冲突了,一个旧版一个新版,
而我们改的-g就是改的那个是make_shared的模板参数,编译器会根据这个去约束后面的参数。make_shared是智能指针,用引用计数来实现内存管理。然后就可以了。

验证

至此,使用VSCode的json文件配置方式就完成了。

可以使用例子进行一下验证。在powershell输入bash run_example.sh即可,注意在本工程目录下输入,不是在虚拟机目录下直接运行。已经可以输出了。
也可以 ./工程输出可执行文件名 --HW_file=‘xxxxx.m’
(没有.o的是链接后的可执行文件,o是临时的,中间文件,汇编文件)

文件版本

如果scons直接运行SConstruct文件,不用修改文件中的错误也可以运行成功。这就比较奇怪了hhhh
结果发现是有两个版本的,脚本自动使用了第二个版本的,所以,还是用脚本吧。
在这里插入图片描述

可以和上面的运行结果作比较,在powershell中使用diff指令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值