我们正在尝试将一个Makefile放在Ubuntu服务器上。
文件结构如下:
/project
Makefile
/files
/src
[all .cpp files, including main.cpp]
/include
[all .h files]
/obj
终端输出:
make: * 没有规则来制作目标files/obj/%.o', needed by
sas'。停止。
我的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)
答案 0 :(得分:3)
此makefile存在 lot 问题。它需要花费很长时间才能逐一修复它们(我试过,它需要数百行),所以让我们从头开始。如果我们手工完成,我们将如何构建此可执行文件?像这样:
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
要构建目标文件,我们使用pattern rule编写automatic variables:
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中维护一个源列表或对象是一个好主意(因为这样多个项目可以共享源文件,而不会将目录结构全部复杂到地狱),但是没有理由维护两个这样的清单。
答案 1 :(得分:1)
您不想手动维护来源列表,对吗?你想要
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 $@
答案 2 :(得分:0)
这对我们有用:
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 $@