WSL VSCode运行C++项目
- collect2: error: ld returned 1 exit status
- boost库的链接
- 安装并编译boost库:
- 链接库(!!这一步有错误,下面会改正)
- /usr/include/boost/python/detail/wrap_python.hpp:57:11: fatal error: pyconfig.h: No such file or directory
- file format not recognized
- gch文件
- boost链接错误
- task.json文件中-g参数包含文件问题
- 验证
- 文件版本
本文按照出错信息进行展开。
collect2: error: ld returned 1 exit status
其实这个问题是上面有很多其他的问题:
所以其实是boost库的依赖问题,这几个库要链接;
boost库的链接
首先是自己boost库最开始的安装就有问题,所以这里重新安装了一下。
安装并编译boost库:
在Ubuntu上安装Boost的五种方法(全网最全,建议收藏)
使用第二种方法安装。
注意:
- 下载压缩包时,使用powershell,
$前 就是当前路径,~ 表示当前用户的home
所以下载完之后再home文件夹中。 - 编译之后,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指令)