1

我们正在尝试在 Ubuntu 服务器上组合一个 Makefile。

文件结构是这样的:

/project
Makefile
/files
    /src
    [all .cpp files, including main.cpp]
    /include
    [all .h files]
    /obj

终端输出:

make: *没有规则来制作目标files/obj/%.o', needed bysas'。停止。

我的制作文件:

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)
4

3 回答 3

3

这个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 中维护一个源或对象列表是一个好主意(因为这样多个项目可以共享源文件而不会使目录结构复杂到地狱),但是没有理由维护两个这样的列表。

于 2013-11-03T13:46:10.203 回答
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 $@
于 2013-11-03T12:17:34.903 回答
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 $@
于 2013-11-03T17:32:26.073 回答