解决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 -lglfw3dll

ifeq ($(OS),Windows_NT)
# 这里是修改要运行的主程序的名称,比如你要运行pro4_main01.cpp,就改成pro4_main01.exe,其他不需要改。并且你想要清除这个的.d和.o,那么同理,修改为指定文件名.exe后,执行{make clean}。建议是用.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的帮助;不过更多是自己的分析,也算误打误撞弄出来了。

六、后语

总之,这篇文章是解决目录下有多个.cpp文件时而不能执行{make run}命令的问题,解决之后,你只需要在Makefile文件中的这里"MAIN    := pro4_main01.exe"改成自己的内容就行!(有注释哦,比如你要运行main01.cpp,就把"pro4_main01.exe"改成"main01.exe",其他不需要改,一个空格也不要动。并且如果你想要清除指定文件的.d和.o文件,那么同理,修改为指定文件名.exe后,执行{make clean}即可。而且建议是用.cpp源文件,.c的不行)

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

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: c/c++项目生成器是一种工具,可以自动生成c/c++项目的基本框架,包括文件结构、编译选项、依赖库等。它可以帮助程序员快速创建一个新的项目,节省时间和精力。常见的c/c++项目生成器有CMake、Autotools、QMake等。 ### 回答2: C/C++项目生成器是一个用于生成C/C++代码和项目的工具,它能够帮助程序员自动生成基本的项目框架和代码文件,简化开发过程,提高开发效率。C/C++项目生成器被广泛应用于软件开发,它可以自动创建和配置项目文件、源代码文件、头文件、Makefile文件、编译器参数等,并且可以支持多种编译器和开发环境。 C/C++项目生成器的使用非常简单,开发者只需按照提示输入一些基本信息,如:项目名称、项目路径、编译器类型、库文件等,然后点击“生成”按钮,项目就可以立即生成。生成后的项目结构清晰、规范,并且符合行业标准。开发者可以在生成的基础上继续开发,节省了很多时间和精力。 除了生成基本的项目框架和代码文件,C/C++项目生成器还可以根据用户需求生成特定的代码,如Socket通信、GUI开发、数据库等。用户只需选择相应的选项,即可生成相应的代码文件。 总的来说,C/C++项目生成器是一个非常有用的工具,它能够帮助开发者快速构建项目,减少重复的工作量,提高开发效率,是现代软件开发必不可少的工具之一。 ### 回答3: C/C++项目生成器是一种用于创建和管理C/C++项目的工具。它通常通过几个步骤来生成项目骨架,包括选择编译器、构建工具、库等。C/C++项目生成器可以减少项目配置的时间和复杂性,帮助开发人员更快地开始编写代码和测试应用程序。 C/C++项目生成器通常支持不同的操作系统和编译器,可以帮助开发人员生成多平台的应用程序。生成器还可以生成不同类型的项目,如控制台应用程序、GUI应用程序、库等。生成器可能还包括其他特性,如代码生成器、自动化测试、静态分析等。 使用C/C++项目生成器可以提高开发效率,减少错误,增强代码质量。它可以自动配置项目并生成必要的文件和代码,减少手动操作和打字的时间。它还可以确保项目的一致性,避免一些常见的错误和误用。 总之,C/C++项目生成器是一种强大的工具,可以帮助开发人员更快、更方便地开始编码和测试C/C++应用程序。通过使用它,开发人员可以更好地专注于应用程序的核心功能,从而更好地增强整个项目的质量和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值