我是makefile的新手,我已经创建了规则(run1,run2等)以分别执行c和c ++对象(单独的编译成功完成c / c ++,也需要分别执行),但似乎无法按预期运行,可以任何人都告诉它出了错以及如何纠正它
TARGET_EXEC ?=
BUILD_DIR ?= .
SRC_DIRS ?= .
SRCS := $(shell find $(SRC_DIRS) -name *.cpp -or -name *.c)
OBJS := $(SRCS:%=$(BUILD_DIR)/%.o)
INC_DIRS := $(shell find $(SRC_DIRS) -type d)
INC_FLAGS := $(addprefix -I,$(INC_DIRS))
CC = gcc
CXX = g++
CFLAGS = -g -Wall
CPPFLAGS = -g -lws2_32 -Wno-write-strings
.PHONY: all run1 run2 run3 clean
all: $(BUILD_DIR)/$(TARGET_EXEC)
$(BUILD_DIR)/$(TARGET_EXEC): $(OBJS)
@echo "Build completed"
# c source
$(BUILD_DIR)/%.c.o: %.c
@echo "Compiling C sources"
@$(CC) $(CFLAGS) $< -o $(basename $(<F))
@echo "Compiled successfully"
# c++ source
$(BUILD_DIR)/%.cpp.o: %.cpp
@echo "Compiling C++ sources"
@$(CXX) -o $(basename $(<F)) $(CXXFLAGS) $< $(CPPFLAGS)
@echo "Compiled successfully"
clean:
@echo "Cleaning"
@$(RM) -r *.exe
@echo "Cleaned up"
run1: $(OBJS)
$(OBJS)=$(SRCS)
$(SRC_DIRS)/%.c.o: %.c
@echo "from run1"
./$(basename $(<F)) ${ARGS}
run2: $(OBJS)
$(OBJS)=$(SRCS)
$(SRC_DIRS)/%.cpp.o: %.cpp
@echo "from run2"
./$(basename $(<F)) ${ARGS}
使用的命令:
make run1
输出:
from run1
-> execution
from run2
-> execution
预期产量
from run1
--> execution of exe created
此外,我试图传递从link引用的参数传递给make。例如:
make ARG="-p TCP -n 127.0.0.1 -e 10006 -l 1" run2
还请让我知道是否可以顺利进行。
最佳答案
看规则:
run1: $(OBJS)
$(OBJS)=$(SRCS)
$(SRC_DIRS)/%.c.o: %.c
@echo "from run1"
./$(basename $(<F)) ${ARGS}
第一行说
run1
依赖于$(OBJS)
,但是没有任何明确的配方。下一行进行分配,最后一行为所有具有某些配方的.c.o
文件定义一个模式规则。这些配方与run1
无关。运行make run1
时,它将构建依赖项($(OBJS)
),其中包括所有cpp.o
和c.o
文件。因此,它将运行两个模式规则,并输出两条行。我想您想要做的是将
$(OBJS)
分为$(C_OBJS)
和$(CPP_OBJS)
,然后使run1
依赖于一组,而run2
依赖于另一组,然后使$(TARGET_EXEC)
取决于两者。关于c++ - Makefile执行多个程序(C/C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42758110/