vscode 中C++运行编译运行多文件问题总结

来源链接:https://blog.csdn.net/weixin_38260878/article/details/101049070?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

vscode 中运行执行编译cpp的问题

初学C++,在参照B站https://www.bilibili.com/video/av41559729?from=search&seid=9852409698812774082上课程学习C++时,有一节课程创建了两个类:圆和点,并赋予了两个类不同的属性,最终实现的功能是判断点和圆之间的关系。

最开始的时候,Cpp程序写在同一个.cpp的文件下,文件可以完美执行!但是课程中拆分了圆类和点类到不同的.cpp和.h文件下,并在包含了主程序main的cpp调用执行,原本期望得到完美的结果我傻了眼,在windows和mac上都得到了一个懵逼的结果。

 

mac上:

 

windows上也是类似的一个结果回头补充。

经过了一下午加晚上的折腾,还是没能找到错误,开始我以为环境配置有问题,按照https://code.visualstudio.com/docs/cpp/config-clang-mac上的教程又重新配置了一遍结果还是不行。在经历了一下午加一晚上的折腾后我心灰意冷,向大神发起求助。大神不愧是大神,一眼就看出问题所在。!

 

插件code-run的运行

上述mac是我安装的code-run执行的结果。默认用的是g++

大神看到mac上的显示一眼就看出问题所在。g++ main.cpp -o main 中我只编译了main.cpp,并没有编译其他我自己定义的cpp文件,因此会抱这个错误,正确的做法是 g++ 所有的.cpp -o main完成编译,然后./加输出的文件名执行打印结果即可。在terminal中是如下结果:

但是code-run插件的默认编译当然是不带circle.cpp这个文件的所以出错了。于是我尝试要修改code-run执行编译task时候的json文件,手动把这些多余的cpp文件加载进去,但是截止现在。还没能成功。。。。。谁能告诉我怎么搞?!哈哈哈

 

所以要注意的是:当有多个cpp文件要参与编译的时候,或者引用第三方库的时候需要协同这些文件一些参与编译(第三方库有可能需要打包成so文件进行链接)。措辞如有错误。。请大佬批评!

 

 

vscode官方教程的编译

 

头铁的我按照官网,也即上面的链接重新配置了环境,还是上述代码,重新shift+command+B进行编译,可想而知,还是差不多类似的错误。

 

ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) The terminal process terminated with exit code: 1

 

 

这一次用的是clang++ ,但编译的时候仍然只有main.cpp这个文件,所以还是错错错!

但是我们可以在前面官方配置的task.json中找到配置, 并添加这cpp

 

再次编译,当然是没有任何错误啦!

 

 

当然,为了应对这些涉及到多文件编译的问题,最好是能在设置中配置json文件能关联到所有的cpp文件,我尝试了几种不同的配置(*.cpp关联失败),但都失败了。但我想一定是可以的。。。谁能再次告诉我!!

 

多文件编译问题

其实上面遇到的问题就是多文件编译的问题,在编辑器里面没有设置好时,自然会弹出这些错误。知乎上有个大神在https://www.zhihu.com/question/30315894也谈及了多文件编译问题:

 

如果你想进行少量的多文件编译,C语言直接用gcc 源文件1.c 源文件2.c 头文件1.h这样就好,C++用g++。默认生成a.exe,加-o可指定输出文件名,其余选项百度gcc使用教程。如果需要多次编译可以写一个批处理。

如果你想进行大量的多文件编译,请学习如何写makefile或使用cmake。然后把tasks的命令改成调用make等。

如果你想使用别人的库,比如ffmpeg,可能需要在命令中指定-I-l(小写的L)、-L。具体参数阅读那个库的文档。还可能需要把路径添加到c_cpp_properties.json和compile_flags.txt里来配置Intellisense。

这些情况下可以考虑单独建一个工作区,不要和单文件编译的共用。其实不新建工程(Project)、只是单文件就能调试,是不利于以后使用和理解大型IDE的。不过初学也不用掌握那么多,不要觉得建工程很麻烦、不建工程就能编译很强就是了。

总之这些和VSC无关,用其它IDE或是手动编译也会遇到差不多的问题,也有点复杂。本文就不多讨论这些了,自行解决。

但是我想这样也太麻烦了吧。在工程目录下,简单的跑一些程序这么麻烦的话,很容易让人放弃,于是继续:

 

MAC系统下上述问题的修改

可以看到我在mac下所用的编译器很混乱,一会clang++ 一会g++,其中g++是vscode的插件code-runner默认的配置,我直接runcode肯定会执行g++,一个是我按照vscode官网配置的clang++,我编译时肯定又调用了clang++。为了统一二者,我继续探索。。不负苦心,我终于找到了配置其环境的setting.json(), cpp的默认的编译器即是g++,这和上面是对应的,于是我把他改成vscode官方教程的clang++。

 

 

大家也看到了文件名的地方,我换成了*.cpp,调用coder-run果然可以直接跑起来啦!

 

同样的我在vscode官方配置的task.json中修改args参数

 

然后编译执行,哇哦。。终于搞定啦!

 

windows下解决

同样的方法在windows下照搬却还是没有得到改正。这让我有点郁闷。。没事继续搞起来!

问题主要有两个1.code-runner中的设置再怎么修改,执行时也不会执行里面的命令。2.crtl+shift+B编译没反应。

第2个问题她妈的是搜狗输入法快捷键和vscode的快捷键冲突了,我删除搜狗之后就可以了。这个时候我在task中修改参数args,并改成*.cpp,于是这一部分解决了。哈哈哈哈!

 

第1个问题,我捣鼓了半天,无意中发现workspace中setting.json中也有个code-runner.excutorMap,而且我执行的命令跑的是workspace中的。于是我修改了workspace中的cpp的命令。于是直接coder-run也可以啦!

 

然后我回到code-runner的setting发现以下。。。于是我把user里面的也全部改过来了。。真的是,全部都是坑!!!啊

 

 

多文件编译只适应于自己写的cpp文件,如果涉及到其他格式文件肯定就不行啦,不过肯定也可以在各种json文件中配置的。

 

至此,豁然开朗。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值