添加glad/glfw后,Makefile构建C OpenGL项目时clang报错不存在文件
问题:Makefile编译时传入无关文件导致clang报错
为C语言OpenGL项目搭建Makefile环境,添加glad和glfw后,编译出现以下错误:
clang: error: no such file or directory: 'all.o'
clang: error: no such file or directory: 'libs'
clang: error: no such file or directory: 'build'
原Makefile代码:
CC = clang `CCFLAGS = -lGL -lglfw -std=c++20 -v -Wall -Wextra -Wepedantic -g -lgdi32 LDFLAGS = lib/glad/src/glad.o lib/glfw/src/libglfw3.a -lgdi32 -lm SRC = $(wildcard src/*.c) OBJ = $(SRC:.c=.o) BIN = bin all: libs build libs: cd lib/glad && $(CC) -o src/glad.o -Iinclude -c src/glad.c cd lib/glfw && cmake . -G 'Unix Makefiles' && make build: $(OBJ) $(CC) -o $(BIN)/build $^ $(LDFLAGS) %.o %.c: $(CC) -o $@ -c $< $(CCFLAGS) run: ./bin/build.exe
问题原因及修复方案
多余反引号导致变量解析错误
CCFLAGS定义行开头的反引号`是语法错误,会打乱Make的变量解析逻辑,直接删除该反引号。模式规则写法错误
%.o %.c:是无效的规则写法,Make会将all、libs、build这些伪目标也匹配到该规则,尝试生成对应的.o文件,这就是报错的核心原因。正确写法应为%.o: %.c,明确表示从.c文件生成.o文件。编译与链接选项混淆
-lGL、-lglfw属于链接阶段的库参数,不应放在编译选项CCFLAGS中,需移到LDFLAGS。同时项目为C语言,编译标准改为-std=c2x(或c17)更合适,另外-Wepedantic是拼写错误,正确为-Wpedantic。glfw编译流程优化
为glfw的cmake命令添加-DCMAKE_BUILD_TYPE=Debug或Release明确编译类型;同时添加目录判断,避免每次执行都重复cmake。
修复后的Makefile
CC = clang CCFLAGS = -std=c2x -v -Wall -Wextra -Wpedantic -g LDFLAGS = lib/glad/src/glad.o lib/glfw/src/libglfw3.a -lGL -lglfw -lgdi32 -lm SRC = $(wildcard src/*.c) OBJ = $(SRC:.c=.o) BIN = bin all: libs build libs: cd lib/glad && $(CC) -o src/glad.o -Iinclude -c src/glad.c cd lib/glfw && [ -d build ] || cmake . -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug && make build: $(OBJ) $(CC) -o $(BIN)/build $^ $(LDFLAGS) %.o: %.c $(CC) -o $@ -c $< $(CCFLAGS) run: ./bin/build.exe
内容的提问来源于stack exchange,提问作者Haunted Theorists
相关产品推荐
相关产品推荐

