C ++ Makefile错误:没有规则来制作目标

时间:2013-11-03 12:07:09

标签: c++ makefile

我们正在尝试将一个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)

3 个答案:

答案 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 $@