解决VSCode中C/C++ Project Generator插件创建的项目只能运行单个程序的问题

初六,履霜,坚冰至。

释意:初六,当你踩着微霜之时,严寒与坚冰也就即将到来。

目录

一、前言

二、问题描述

三、解决方案

1、思路总结

2、思考过程

3、解决方案(直接用,报错找我(ノ*・ω・)ノ)

四、注意事项

五、参考文章

六、后语


一、前言

承接上文按F5调试这块,我在使用ctrl+shift+p创建一个新的C语言项目后,通过{make}编译,{make run}运行程序,发现一个很难受的问题,就是src目录下不能有多个.c或.cpp源文件,一旦运行{make}就会使所有的文件都被编译,然后就报错,所以一度导致我运行一个新的程序就需要新建一个项目,后面试过在src下新建一个files文件(名字随便起),然后当你要运行这个程序时,就把代码复制粘贴到main.cpp中,覆盖掉原有代码,main.cpp就相当于一个工具。但这还是好麻烦,每次需要清理掉先前编译的.d和.o文件。于是我学习了一下makefile文件,最终做出了一点改动,解决了问题!

二、问题描述

g++ -std=c++17 -Wall -Wextra -g -Iinclude -o output\main.exe src/main.o src/main01.o  -Llib
d:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: src/main01.o: in function `main':
F:\graphic_code\testProject/src/main01.cpp:4: multiple definition of `main'; src/main.o:F:\graphic_code\testProject/src/main.cpp:4: first defined here
collect2.exe: error: ld returned 1 exit status
Makefile:77: recipe for target 'main.exe' failed
make: *** [main.exe] Error 1

三、解决方案

1、思路总结
  • 几个变量的作用:
    • $(DEPS):.d文件列表,不信你去输出一下,在clean下面加上:@echo ${DEPS},执行一下make clean就能看得到。经过我们修改,它只包含一个main01.d
    • $(MAIN:.exe=.cpp):相当于把main01.exe替换成main01.cpp
    • SOURCES:源文件列表
    • DEPS:输出文件列表
  1. 开始看到MAIN,修改为自定义文件名main01.exe无果;
  2. 不断利用clean进行测试,因为make run这里构建不成功,也就看不到回显,所以我决定去clean下面调试。在得知MAIN就是main01.exe,思考:如果修改一下,$(MAIN:.exe=.d)指的是main01.d,那么就实现了编译指定的单个文件,而不会受到其他文件的影响。
2、思考过程

1)可以在Makefile文件中修改名称,这样就不需要每次都修改文件名。上面这main.exe是输出到output目录下的可执行文件名($(OS),Windows_NT判断是否为Windows环境,在Windows下程序直接进入if,所以我们需要修改它,下面else里面这个main可以不用修改,我这里之前不知道才改成了main01;但是如果你是Linux,那么会进入else,就要去改下面的MAIN),这里我创建了一个files文件夹来存放一些其他实验所用的文件,因为这个根目录下只允许存放一个程序文件,不能在有main.c和main01.c共同存在的情况下{make run}运行成功,猜测是在Makefile中根据后缀名.d和.o来找的文件,而不是main.c的文件名来找的,所以导致会搜索到多个.o或.d文件,引起故障。

2)果然如此,哈哈,一切都是这个$(DEDPS)变量在作妖,我们在clean下面加上一句:
 

@echo ./$(OUTPUTMAIN),$(DEPS)

起到调试作用。然后执行{make clean},可以看到,它在赋值的时候,把所有src目录下的.d文件名都给赋值进去了,导致我们搜索不到唯一的一个文件main.d。

3)结果:我们可以看到,尽管main02.cpp也在,但是并不会影响到main01.c的构建和运行,并且这俩都能分开隔离运行。

3、解决方案

只需要把你的Makefile文件修改为以下内容。(有需要的话调整一下格式即可,因为在makefile文件中Tab键也是有作用的,不能随便放)

#
# 'make'        build executable file 'main'
# 'make clean'  removes all .o and executable files
## define the Cpp compiler to use
CXX = g++# define any compile-time flags
CXXFLAGS	:= -std=c++17 -Wall -Wextra -g# define library paths in addition to /usr/lib
#   if I wanted to include libraries not in /usr/lib I'd specify
#   their path using -Lpath, something like:
LFLAGS =# define output directory
OUTPUT	:= output# define source directory
SRC		:= src# define include directory
INCLUDE	:= include# define lib directory
LIB		:= lib
LIBRARIES := -lglad -lglfw3dllifeq ($(OS),Windows_NT)
# 这里是修改要运行的主程序的名称,比如你要运行pro4_main01.cpp,就改成pro4_main01.exe,其他不需要改。并且你想要清除这个的.d和.o,那么同理,修改为指定文件名,建议用.cpp源文件,.c的不行
MAIN	:= pro4_main01.exe
SOURCEDIRS	:= $(SRC)
INCLUDEDIRS	:= $(INCLUDE)
LIBDIRS		:= $(LIB)
FIXPATH = $(subst /,\,$1)
RM			:= del /q /f
MD	:= mkdir
else
MAIN	:= main
SOURCEDIRS	:= $(shell find $(SRC) -type d)
INCLUDEDIRS	:= $(shell find $(INCLUDE) -type d)
LIBDIRS		:= $(shell find $(LIB) -type d)
FIXPATH = $1
RM = rm -f
MD	:= mkdir -p
endif# define any directories containing header files other than /usr/include。头文件目录
INCLUDES	:= $(patsubst %,-I%, $(INCLUDEDIRS:%/=%))# define the C libs。库文件目录
LIBS		:= $(patsubst %,-L%, $(LIBDIRS:%/=%))# define the C source files。源文件列表,这里我将所有.cpp的替换成了.exe,所以.c的还没做处理,很可能会报错。
SOURCES		:= $(wildcard $(patsubst %,%/$(MAIN:.exe=.cpp), $(SOURCEDIRS)))# define the C object files
OBJECTS		:= $(SOURCES:.cpp=.o)# define the dependency output files
DEPS		:= $(OBJECTS:.o=.d)#
# The following part of the makefile is generic; it can be used to
# build any executable just by changing the definitions above and by
# deleting dependencies appended to the file from 'make depend'
#
# 这里就是输出到output目录下的文件main.exe
OUTPUTMAIN	:= $(call FIXPATH,$(OUTPUT)/$(MAIN))all: $(OUTPUT) $(MAIN)@echo Executing 'all' complete!$(OUTPUT):$(MD) $(OUTPUT)$(MAIN): $(OBJECTS)$(CXX) $(CXXFLAGS) $(INCLUDES) -o $(OUTPUTMAIN) $(OBJECTS) $(LFLAGS) $(LIBS) ${LIBRARIES}# include all .d files
-include $(DEPS)# this is a suffix replacement rule for building .o's and .d's from .c's
# it uses automatic variables $<: the name of the prerequisite of
# the rule(a .c file) and $@: the name of the target of the rule (a .o file)
# -MMD generates dependency output files same name as the .o file
# (see the gnu make manual section about automatic variables)
.cpp.o:$(CXX) $(CXXFLAGS) $(INCLUDES) -c -MMD $<  -o $@.PHONY: clean
clean:$(RM) $(OUTPUTMAIN)$(RM) $(call FIXPATH,$(OBJECTS))$(RM) $(call FIXPATH,$(DEPS))@echo Cleanup complete!run: all./$(OUTPUTMAIN)@echo Executing 'run: all' complete!

四、注意事项

  • 注意这一行:SOURCES        := $(wildcard $(patsubst %,%/$(MAIN:.exe=.cpp), $(SOURCEDIRS)))#这里我只对.cpp做了处理,所以你文件后缀为.c的话是不行的,不过应该也不难解决,本人只是一时有这兴致写写,费了半个下午(将近两个小时)。如果各位观此博文者有需C文件需要编译,欢迎评论区提出,我可以尝试一下实现“或”的逻辑匹配。你也可以先把这行里面的.cpp改成.c,先用着。
  • 注意你是Windows还是Linux环境,就在那个if-else语句里面改上面的MAIN还是改下面的MAIN。

五、参考文章

参考文章:Makefile教程(绝对经典,所有问题看这一篇足够了)-CSDN博客;

还有chatMoss的帮助;不过更多是自己的分析,也算误打误撞弄出来了。

六、后语

计算机图形学实验已完成个数四舍五入一下相当于还没写,谁懂啊?网上全特喵的用<glut.h>,我用的是<glad.h>和<glew.h>两个库,找教程都没地找QAQ。而且还费了半个下午的功夫解决这个问题,不过确实觉得解决这些比实际开发有意思多了。不多说了,赶图形学实验去咯!┗|`O′|┛ 嗷~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2660707.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

超声功率放大器怎么用

超声功率放大器是一种用于放大超声信号的设备&#xff0c;广泛应用于医疗领域、工业领域和科学研究中。它能够将超声信号的能量增加到足够大的水平&#xff0c;以便进行高强度超声疗法、材料加工和实验研究等应用。下面将详细介绍超声功率放大器的使用方法和其工作原理。 首先&…

数据结构——红黑树 and B-树

红黑树 根据平衡条件第4、5两点 最短路径&#xff0c;都是黑色 最长路径&#xff0c;红黑相间 最长是最短的两倍 B-树

《深入理解Java虚拟机(第三版)》读书笔记:Java内存区域与内存溢出异常、垃圾收集器与内存分配策略

下文是阅读《深入理解Java虚拟机&#xff08;第3版&#xff09;》这本书的读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 第2章 Java内存区域与内存溢出异常2.2 运行时数据区域2.3 HotSpot虚拟机对象探秘 第3章 垃圾收集器与内存分配策略3.2 对象已死&…

安装Node修改Node镜像地址搭建Vue脚手架创建Vue项目

1、安装VSCode和Node 下载VSCode Visual Studio Code - Code Editing. Redefined 下载Node Node.js (nodejs.org) 检验是否安装成功&#xff0c;WinR,输入cmd命令&#xff0c;使用node -v可以查看到其版本号 2、修改镜像地址 安装好node之后&#xff0c;开始修改镜像地址 …

【 YOLOv5】目标检测 YOLOv5 开源代码项目调试与讲解实战(4)-自制数据集及训练(使用makesense标注数据集)

如何制作和训练自己的数据集 看yolov5官网创建数据集1.搜索需要的图片2.创建标签标注数据集地址&#xff1a;放入图片后选择目标检测创建文档&#xff0c;每个标签写在单独的一行上传结果此处可以编辑类别把车框选选择类别即可导出数据 3.新建一个目录放数据写yaml文件 4. 测试…

重装系统以后无法git跟踪

总结&#xff1a;权限问题 故障定位 解决方案&#xff1a; 复制一份新的文件夹。&#xff08;新建的文件创建和写入权限都变了&#xff09; 修改文件为新的用户 执行提示的命令

docker +gitee+ jenkins +maven项目 (一)

jenkins环境和插件配置 文章目录 jenkins环境和插件配置前言一、环境版本二、jenkins插件三、环境安装总结 前言 现在基本都是走自动化运维&#xff0c;想到用docker 来部署jenkins &#xff0c;然后jenkins来部署java代码&#xff0c;做到了开箱即用&#xff0c;自动发布代码…

磁盘相关知识

一、硬盘数据结构 1.扇区&#xff1a; 盘片被分为多个扇形区域&#xff0c;每个扇区存放512字节的数据&#xff08;扇区越多容量越大&#xff09; 存放数据的最小单位 512字节 &#xff08;硬盘最小的存储单位是扇区&#xff0c;512 个字节&#xff0c;八个扇区组成一块&…

H5向微信小程序发送信息(小程序web-view打开H5)

引入weixin-js-sdk npm i weixin-js-sdk 页面引入 // 引入wxjsimport wx from "weixin-js-sdk"; 点击触发方法 methods: {goweap(id){console.log(wx);// H5传递数据 &#xff08;navigateBack&#xff09;wx.miniProgram.navigateBack({delta: 1});wx.min…

Android APK未签名提醒

最近新建了一个项目&#xff0c;在build.gradle中配置好了签名&#xff0c;在执行打包的时候打出的包显示已签名&#xff0c;但是在上传市场的时候提示未签名。于是排查了好久&#xff0c;发现在build.gradle中配置的minsdk 24&#xff0c;会导致不使用V1签名&#xff0c;于是我…

redis容灾的方案设计

背景 今年各个大厂的机房事故频繁&#xff0c;其中关键组件Redis是重灾区&#xff0c;本文就来看下怎么做Redis的多机房容灾 Redis多机房容灾方案 1.首先最最直观的是直接利用Redis内部的主从数据同步来进行灾备&#xff0c;但是由于Redis内部的主从实现对机房间的网络延迟等…

[OCR]Python 3 下的文字识别CnOCR

目录 1 CnOCR 2 安装 3 实践 1 CnOCR CnOCR 是 Python 3 下的文字识别&#xff08;Optical Character Recognition&#xff0c;简称OCR&#xff09;工具包。 工具包支持简体中文、繁体中文&#xff08;部分模型&#xff09;、英文和数字的常见字符识别&#xff0c;支持竖…

文件下载输出zip文件

文件下载输出成zip文件&#xff1a; 1、前端整个按钮&#xff0c;调js方法&#xff1a;&#xff08;参数&#xff1a;param,需要下载的id&#xff0c;用逗号拼接&#xff09; var param "?dto.id";//需要自己拼接param window.location.href "<%basePat…

OSFP协议配置实验

实验目的&#xff1a; &#xff08;1&#xff09;理解OSPF&#xff1b; &#xff08;2&#xff09;掌握OSPF的配置方法&#xff1b; &#xff08;3&#xff09;掌握查看OSPF协议的相关信息。 实验器材&#xff1a; Cisco packet 实验内容&#xff1a; 实验步骤&#xff1…

简单的vxlan实验

拓扑如下 如上拓扑&#xff0c;PC1与PC3在同一个大二层广播域&#xff0c;PC2与PC4在同一个大二层广播域&#xff0c;我们要把PC1到PC3通过vxlan做通&#xff0c;PC2与PC4做通。 1.接入交换机SW1配置 vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type trun…

时序预测 | Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序列预测

时序预测 | Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序列预测 目录 时序预测 | Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序…

postman win7 低版本 postman7.0.9win64 postman7.0.9win32

百度网盘&#xff1a; postman7.0.9win64&#xff1a; 链接: https://pan.baidu.com/s/18ck9tI0r9Pqoz36MOwwnnQ 提取码: rkf7 postman7.0.9win32&#xff1a; 链接: https://pan.baidu.com/s/1HrpGPrgvVzyAcjdHuwVOpA 提取码: ke5k win7系统安装postman&#xff0c;可能会…

python-39-flask+nginx+Gunicorn的组合应用

flask nginx Gunicorn 王炸 1 flasknginxgunicornsupervisor 1.1 myapp.py from flask import Flask app Flask(__name__)app.route("/") def test_link():return "the link is very good"if __name__"__main__":app.run()默认是5000端口…

什么是Wi-Fi Halow,它是基于什么标准,它的主要优势在哪

文章目录 1.1 背景1.2 技术前景2.1 Wi-Fi HaLow主要优势2.2 Wi-Fi HaLow技术特性2.3 具体技术特点2.4 支持频段介绍3.1 应用场景3.2 WiFi-HaLow芯片厂商3.3 基于WiFi-HaLow芯片网关与模组商1.1 背景 Wi-Fi HaLow是2021年11月Wi-Fi联盟发布的一项基于IEEE 802.11ah最新标准,专…

Spring Boot笔记1

1. SpringBoot简介 1.1. 原有Spring优缺点分析 1.1.1. Spring的优点分析 Spring是Java企业版&#xff08;Java Enterprise Edition&#xff0c;javeEE&#xff09;的轻量级代替品。无需开发重量级的Enterprise JavaBean&#xff08;EJB&#xff09;&#xff0c;Spring为企业…