我曾尝试为我的项目编写makefile并写了这个:
SRC_DIR = src
OBJ_DIR = obj
CX = g++
CC = gcc
SRCS =
OBJS =
LDFLAGS =
CFLAGS = -Wall
.PHONY = main
main: SRCS += $(SRC_DIR)/main.cpp
main: OBJS += $(OBJ_DIR)/main.o
main: $(OBJS)
$(CX) -o release $(OBJS) $(LDFLAGS)
$(OBJ_DIR)/main.o: $(SRC_DIR)/main.cpp
$(CX) -o $@ -c $^ $(CFLAGS)
但是当我打电话给make main
时输出是:
g++ -o main obj/main.o
g++: error: obj/main.o: No such file or directory
g++: fatal error: no input files
compilation terminated.
make: *** [Makefile:17: main] Error 1
main.cpp是hello world
P.S。抱歉我的英文
答案 0 :(得分:0)
"规则定义" GNU Make手册中3.7 How make Reads a Makefile部分的小节描述了如何扩展规则的各个部分:
immediate: immediate ; deferred deferred
在Makefile中的行
main: $(OBJS)
对应
immediate: immediate
参与文档。因此Make看到规则与这样的食谱:
main:
$(CX) -o release $(OBJS) $(LDFLAGS)
换句话说,您尝试做的事情不应该起作用。不要使用target-specific variables来定义依赖关系。
答案 1 :(得分:0)
只需重新定义没有main:
前缀的OBJS和SRCS:
SRC_DIR = src
OBJ_DIR = obj
CX = g++
CC = gcc
SRCS =
OBJS =
LDFLAGS =
CFLAGS = -Wall
.PHONY = main
# NOTE THE DIFFERENCE HERE: no 'main:'
SRCS += $(SRC_DIR)/main.cpp
OBJS += $(OBJ_DIR)/main.o
main: $(OBJS)
$(CX) -o release $(OBJS) $(LDFLAGS)
$(OBJ_DIR)/main.o: $(SRC_DIR)/main.cpp
$(CX) -o $@ -c $^ $(CFLAGS)