C++ Makefile在项目根目录运行时无法识别相对路径目录问题
问题原因
- 核心错误是混淆了相对路径和绝对路径的写法规则:
在类Unix系统中,路径以/开头代表从系统根目录开始寻址的绝对路径,你写的/src/main.cpp会直接去系统根目录下找src文件夹,而不是你当前执行make命令的Ass1项目目录下的src文件夹,自然找不到对应文件。 - Link阶段的路径也存在同样错误:
/bin/main、/bin/main.o都会寻址到系统根目录下的bin文件夹,而非项目内的bin目录,就算编译阶段通过链接也会失败。
修复后的正确Makefile
直接去掉所有项目内相对路径开头的/即可,或者加./前缀也可以(./代表当前工作目录,也就是你执行make命令的Ass1根目录):
all: clean compile link link: g++ -o bin/main bin/main.o bin/Workout.o bin/Trainer.o bin/Studio.o compile: g++ -g -Wall -Weffc++ -c -o bin/main.o src/main.cpp g++ -g -Wall -Weffc++ -c -o bin/Studio.o src/Studio.cpp g++ -g -Wall -Weffc++ -c -o bin/Workout.o src/Workout.cpp g++ -g -Wall -Weffc++ -c -o bin/Trainer.o src/Trainer.cpp clean: rm -f bin/*
可选优化
可以通过定义变量简化Makefile写法,后续修改目录、编译参数时只需要改一处即可:
# 定义公共变量 SRC_DIR := src BIN_DIR := bin CXX := g++ CXXFLAGS := -g -Wall -Weffc++ all: clean compile link link: $(CXX) -o $(BIN_DIR)/main $(BIN_DIR)/*.o compile: $(CXX) $(CXXFLAGS) -c -o $(BIN_DIR)/main.o $(SRC_DIR)/main.cpp $(CXX) $(CXXFLAGS) -c -o $(BIN_DIR)/Studio.o $(SRC_DIR)/Studio.cpp $(CXX) $(CXXFLAGS) -c -o $(BIN_DIR)/Workout.o $(SRC_DIR)/Workout.cpp $(CXX) $(CXXFLAGS) -c -o $(BIN_DIR)/Trainer.o $(SRC_DIR)/Trainer.cpp clean: rm -f $(BIN_DIR)/*
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

