几个制作文件问题
a couple of Makefile issues
我有这个Makefile:
CFLAGS = -c -Wall
CC = g++
EXEC = main
SOURCES = main.cpp listpath.cpp Parser.cpp
OBJECTS = $(SOURCES: .cpp=.o)
EXECUTABLE = tp
DIR_SRC = /src/
DIR_OBJ = /obj/
all: $(SOURCES) $(OBJECTS)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(CFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
clean:
rm $(OBJECTS) $(EXECUTABLE)
请注意:
- 我在包含生成文件的目录"."中
- 文件夹"./src"存在,并且包含所有 .h 和 .cpp 文件
- 文件夹"./obj"不存在,我希望makefile创建它并将所有.o放在那里
我得到的错误是:
No rules to build "main.cpp", necessary for "all". Stopping.
帮助!
好的,从顶部开始:
CFLAGS = -c -Wall
CC = g++
# EXEC = main never used, not needed
SOURCES = main.cpp listpath.cpp Parser.cpp
目前为止,一切都好。请注意,此SOURCES
没有提到DIR_SRC
,因此我们必须稍后建立该连接(并且$(DIR_SRC)$(SOURCES)
不起作用,因为必须将路径附加到列表的每个成员)。但OBJECTS
确实需要路径(例如 /obj/main.o
):
OBJECTS = $(patsubst %.cpp, $(DIR_OBJ)%.o, $(SOURCES))
EXECUTABLE = tp
DIR_SRC = /src/
DIR_OBJ = /obj/
(就我个人而言,我不喜欢将尾部斜杠放在变量中,但这是一个品味问题。第一个目标是默认目标,因此它应该构建您实际想要构建的内容:
all: $(EXECUTABLE)
不要担心将来源列为先决条件;它们稍后会自行解决。
$(EXECUTABLE): $(OBJECTS)
$(CC) $(CFLAGS) $^ -o $@ # <-- note the automatic variable $^
.cpp.o
约定在这里并不真正起作用;我们必须把它说清楚。我们必须告诉 Make 在$(DIR_SRC)
中搜索.cpp
文件:
$(OBJECTS): $(DIR_OBJ)%.o: %.cpp $(DIR_OBJ)
$(CC) $(CFLAGS) $< -o $@
$(DIR_OBJ):
mkdir $@
vpath %.cpp $(DIR_SRC)
并告诉 Make clean
不是真正的目标,只是为了安全起见:
.PHONY: clean
clean:
rm $(OBJECTS) $(EXECUTABLE)
编辑:
我不应该一步到位地尝试这么多。让我们尝试更简单的方法:
$(DIR_OBJ)%.o: $(DIR_SRC)%.cpp $(DIR_OBJ)
$(CC) $(CFLAGS) $< -o $@
编辑SOURCES
以包含源目录(例如 src/main.cpp
等)。
对于目标文件,请考虑如下内容:
OBJECTS = $(subst src/,obj/,$(SOURCES:%.cpp=%.o))
# ...
all: $(SOURCES) build
.PHONY: build
build: pre_build $(EXECUTABLE)
.PHONY: pre_build
pre_build: obj
obj:
-mkdir obj
$(EXECUTABLE): $(OBJECTS)
$(CC) $(CFLAGS) $^ -o $@
相关文章:
- 使用mongocxx驱动程序时包含头文件问题
- 生成文件问题
- 从文件问题加载纹理 Android NDK 和 OpenGL
- Xcode 11 头文件问题
- 使用 c++ ifstream 读取文本文件问题
- 单独的类声明和方法定义文件问题
- C++生成文件问题
- 生成文件问题(体系结构x86_64的未定义符号:"_main",引用自:主可执行文件的隐式入口/启动)
- C++删除未使用的库的生成文件问题
- C++ 使文件问题
- 阅读矩阵市场文件C++问题
- 查找第一个文件问题无法使任何示例正常工作。
- "Recursive Makefile Considered Harmful"样式生成文件问题
- 标题文件问题中的类定义
- 嵌套 while 循环,包含文件 c++ 问题
- 几个制作文件问题
- 生成文件问题,获取"目标'rgbapixel.o'的配方失败"
- 从yaml文件问题opencv读取数据
- 类成员C++标头和 .cc 文件问题
- 添加选项以显示百分比时出现生成文件问题