赞
踩
初六,履霜,坚冰至。
释意:初六,当你踩着微霜之时,严寒与坚冰也就即将到来。
目录
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)可以在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的构建和运行,并且这俩都能分开隔离运行。
只需要把你的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,那么同理,修改为指定文件名,建议用.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!
参考文章:Makefile教程(绝对经典,所有问题看这一篇足够了)-CSDN博客;
还有chatMoss的帮助;不过更多是自己的分析,也算误打误撞弄出来了。
计算机图形学实验已完成个数四舍五入一下相当于还没写,谁懂啊?网上全特喵的用<glut.h>,我用的是<glad.h>和<glew.h>两个库,找教程都没地找QAQ。而且还费了半个下午的功夫解决这个问题,不过确实觉得解决这些比实际开发有意思多了。不多说了,赶图形学实验去咯!┗|`O′|┛ 嗷~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。