【问题标题】:a couple of Makefile issues几个 Makefile 问题
【发布时间】:2012-09-16 14:10:32
【问题描述】:

我有这个 Makefile:

CFLAGS = -c -Wall
CC = g++
EXEC = main
SOURCES = main.cpp listpath.cpp Parser.cpp
OBJECTS = $(SOURCES: .cpp=.o)
EXECUTABLE = tp

DIR_SRC = /src/
DIR_OBJ = /obj/

all: $(SOURCES) $(OBJECTS)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm $(OBJECTS) $(EXECUTABLE)

注意这一点:

  • 我在目录“.”中。其中包含生成文件
  • 文件夹“./src”已存在,并包含所有 .h 和 .cpp 文件
  • 文件夹“./obj”不存在,我想让makefile创建它并将所有的.o放在那里

我得到的错误是:

No rules to build "main.cpp", necessary for "all". Stopping.

救命!

【问题讨论】:

  • 你定义了DIR_SRC,你再也没有提到它,所以Make不知道去那里看。这是否足够,或者更多建议会有所帮助?
  • 好的,所以我修改了这个:all: $(DIR_SRC)$(SOURCES) $(OBJECTS),仍然不起作用。
  • 也许您需要调查 VPATH?
  • 如果你能告诉我我的 Makefile 出了什么问题,那真的很有帮助:(

标签: c++ makefile


【解决方案1】:

好的,从上到下:

CFLAGS = -c -Wall
CC = g++
# EXEC = main never used, not needed
SOURCES = main.cpp listpath.cpp Parser.cpp

到目前为止,一切都很好。请注意,这个SOURCES 没有提到DIR_SRC,所以我们稍后必须建立这个连接(而$(DIR_SRC)$(SOURCES) 将不起作用,因为路径必须附加到每个成员名单)。但是OBJECTS 确实需要路径(例如/obj/main.o):

OBJECTS = $(patsubst %.cpp, $(DIR_OBJ)%.o, $(SOURCES))
EXECUTABLE = tp

DIR_SRC = /src/
DIR_OBJ = /obj/

(我个人不喜欢将斜杠放在变量中,但这只是个人喜好问题。)第一个目标是默认目标,因此它应该构建您真正想要构建的内容:

all: $(EXECUTABLE)

不必担心将来源列为先决条件;他们稍后会自行解决。

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $^ -o $@  # <-- note the automatic variable $^

.cpp.o 约定在这里并不适用;我们必须把它拼出来。我们必须告诉 Make 在 $(DIR_SRC) 中搜索 .cpp 文件:

$(OBJECTS): $(DIR_OBJ)%.o: %.cpp $(DIR_OBJ)
    $(CC) $(CFLAGS) $< -o $@

$(DIR_OBJ):
    mkdir $@

vpath %.cpp $(DIR_SRC)

并告诉 Make clean 不是真正的目标,只是为了安全起见:

.PHONY: clean
clean:
    rm $(OBJECTS) $(EXECUTABLE)

编辑:

我不应该一步一步尝试这么多。让我们尝试一些更简单的方法:

$(DIR_OBJ)%.o: $(DIR_SRC)%.cpp $(DIR_OBJ)
    $(CC) $(CFLAGS) $< -o $@

【讨论】:

  • 我根据你的建议编辑了我的 Makefile...现在它说“没有规则来构建目标”/obj/main.o”,这是“tp”所必需的”
  • @l19:抱歉,错误粘贴了$(OBJECTS) 规则。固定的。立即尝试。
  • 仍然无法工作 :( "没有规则来构建目标 "main.cpp",对于 "/obj/main.o" 是必需的"
  • @l19: 等等……你用的是哪个版本的 Make? (make -v)
【解决方案2】:

编辑SOURCES 以包含源目录(例如src/main.cpp 等)。

对于目标文件,请考虑以下内容:

OBJECTS = $(subst src/,obj/,$(SOURCES:%.cpp=%.o))

# ...

all: $(SOURCES) build

.PHONY: build
build: pre_build $(EXECUTABLE)

.PHONY: pre_build
pre_build: obj

obj:
    -mkdir obj

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $^ -o $@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2015-01-03
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多