[英]C++ Makefile error: No rule to make target
我们正在尝试将一个Makefile放在Ubuntu服务器上。
文件结构是这样的:
/project
Makefile
/files
/src
[all .cpp files, including main.cpp]
/include
[all .h files]
/obj
终端输出:
make: *没有规则来制作目标files/obj/%.o', needed by
/%。o',sas' files/obj/%.o', needed by
。 停止。
我的Makefile:
CC=g++
CFLAGS=-c -Wall
OBJECTS=main.o Parser.o People.o Person.o Queries.o Relation.o
SOURCES=main.cpp Parser.cpp People.cpp Person.cpp Queries.cpp Relation.cpp
all: sas
sas: files/obj/%.o
$(CC) $(OBJECTS) -o sas
files/obj/%.o: files/src/%.cpp
$(CC) $(CFLAGS) $(SOURCES)
这个makefile有很多问题。 它需要花费很长时间才能逐一修复它们(我试过,它需要数百行),所以让我们从头开始。 如果我们手工完成,我们将如何构建此可执行文件? 像这样:
g++ -c -Wall files/src/main.cpp -o files/obj/main.o
g++ -c -Wall files/src/Parser.cpp -o files/obj/Parser.o
...
g++ -c -Wall files/src/Relation.cpp -o files/obj/Relation.o
g++ -Wall files/obj/main.o files/obj/Parser.o ... files/obj/Relation.o -o sas
CXX=g++
files/obj/%.o: files/src/%.cpp
$(CXX) -c -Wall $< -o $@
要构建可执行文件,我们使用构造的对象列表:
MODULES = main Parser People Person Queries Relation
OBJECTS = $(patsubst %, files/obj/%.o, $(MODULES))
sas: $(OBJECTS)
$(CXX) $^ -o $@
请注意,根本不需要SOURCES
。 我认为在makefile中维护一个源列表或对象是一个好主意 (因为这样多个项目可以共享源文件,而不会使目录结构全部复杂到地狱),但是没有理由维护两个这样的列表。
您不想手动维护源列表,对吗? 你要
CC=g++
CFLAGS=-c -Wall
SOURCES=$(wildcard files/src/*.cpp)
sas: $(SOURCES:files/src/%.cpp=files/obj/%.o)
$(CC) $^ -o $@
files/obj/%.o: files/src/%.cpp
$(CC) $(CFLAGS) $< -o $@
这对我们有用:
CC=g++
CFLAGS=-c -Wall -std=c++11
SOURCES=$(wildcard Hackathon/src/*.cpp)
sas: $(SOURCES:Hackathon/src/%.cpp=Hackathon/obj/%.o)
$(CC) $^ -o $@
Hackathon/obj/%.o: Hackathon/src/%.cpp
$(CC) $(CFLAGS) $< -o $@
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.