【发布时间】:2019-11-05 20:54:51
【问题描述】:
我正在尝试设置我的 Makefile,以便我可以在一些变量中定义所有输入和输出,因此我只需要编写一个规则来编译项目。这使我可以最小化 Makefile 代码,并且仍然可以控制我的项目中的内容。这是相关的sn-p代码:
ROOT_OBJS= \
$(B)/main.o \
$(B)/src1.o
ROOT_SRC= \
$(SRC)/main.cpp \
$(SRC)/src1.cpp
$(TARGET) : $(ROOT_OBJS)
$(LD) $(LD_FLAGS) $^ -o $@
$(ROOT_OBJS) : $(ROOT_SRC)
$(CXX) $(CFLAGS) $< -o $@
除了第二条规则中的$< 部分外,这大部分都有效,它总是使用main.cpp。有什么解决办法吗?或者我是不是走错了路?
编辑:为了澄清,这是我期望的输出:
g++ main.cpp -o main.o
g++ src1.cpp -o src1.o
这是我得到的输出:
g++ main.cpp -o main.o
g++ main.cpp -o src1.o
我知道这是因为 $< 采用了第一个依赖项,我认为 make 会足够聪明地解决这个问题,因为 .o 行为是我想要的。
$^ 不是我想要的。我希望 gcc 为每个 cpp 文件创建一个单独的目标文件。
【问题讨论】:
-
你根本不需要第二条规则。
make知道如何从.cpp创建.o。 -
“它总是使用 main.cpp”似乎没有错。您可能暗示它从不处理 src1。为何如此?什么输出/行为/症状让你这么认为?请证明您遇到的问题。你做了什么?例如。你触摸了哪个文件?你期待什么?
-
您是否在寻找插入整个依赖行的
$^? -
@Yunnosch 我编辑了 OP 以进行澄清。
-
@ryan 看看我的做法github.com/igagis/prorab