繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM