make不编译源文件

时间:2017-12-24 13:56:21

标签: makefile

我曾尝试为我的项目编写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。抱歉我的英文

2 个答案:

答案 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)