Makefile依赖项变量

Makefile依赖项变量,makefile,gnu-make,Makefile,Gnu Make,我有一个简单的Makefile。当我不在依赖项列表中使用变量时,它可以正常工作。否则会产生衰减错误: make: *** No rule to make target 'ext/configXML.o', needed by 'libledrgb-jni.so'. Stop. 而且当我这样做的时候 make print-LED-CFG-SRC LED-CFG-SRC = ../led-cfg/src 因此,该值设置正确,尽管我为该文件显式添加了规则: ext/configXML.o

我有一个简单的Makefile。当我不在依赖项列表中使用变量时,它可以正常工作。否则会产生衰减错误:

make: *** No rule to make target 'ext/configXML.o', needed by 'libledrgb-jni.so'.  Stop.
而且当我这样做的时候

    make print-LED-CFG-SRC
LED-CFG-SRC = ../led-cfg/src
因此,该值设置正确,尽管我为该文件显式添加了规则:

ext/configXML.o: $(LED-CFG-SRC)/%.cc 
@echo 'Building file: $<'
@${CXX} $(CXXFLAGS) -c -o "$@" "$<"
但该文件存在:

   make list
ls -la ../led-cfg/src
total 340
drwxrwxr-x  2 gigi gigi  4096 lip 27 13:10 .
drwxrwxr-x 12 gigi gigi  4096 lip 28 10:08 ..
-rw-rw-r--  1 gigi gigi 11918 lip 28 09:54 configXML.cc
-rw-rw-r--  1 gigi gigi  2891 lip 27 13:17 configXML.h
以下是源Makefile:

    EXTOBJS = ext/configXML.o ext/packet.o ext/tinyxml2.o ext/crypt.o ext/rozkaz.o
    LED-CFG-SRC := ../led-cfg/src/ 
    INCLUDES := -I$(LED-CFG-SRC)
    CXXFLAGS := $(INCLUDES)
    LIBRARY := libledrgb-jni.so

    CXXFLAGS := $(INCLUDES) -fPIC -std=c++14

    all: dirs $(LIBRARY)

    $(LIBRARY): $(OBJFILES) $(EXTOBJS)
        $(CXX) -shared -o $@ $^



    ext/%.o: $(LED-CFG-SRC)/%.cc 
        @echo 'Building file: $<'
        @${CXX} $(CXXFLAGS) -c -o "$@" "$<"


    clean:
        rm -rf $(EXTOBJS)

    list:
        ls -la $(LED-CFG-SRC)

    print-%  : ; @echo $* = $($*)


    .PHONY: clean dirs
EXTOBJS=ext/configXML.oext/packet.oext/tinyxml2.oext/crypt.oext/rozkaz.o
LED-CFG-SRC:=../LED CFG/SRC/
包括:=-I$(LED-CFG-SRC)
CXXFLAGS:=$(包括)
库:=libledrgb-jni.so
CXXFLAGS:=$(包括)-fPIC-std=c++14
全部:目录$(库)
$(库):$(OBJFILES)$(exextbjs)
$(CXX)-共享-o$@$^
ext/%.o:$(LED-CFG-SRC)/%.cc

@echo建筑文件:$在黑暗中拍摄。至少在您发布的
Makefile
列表中,
LED-CFG-SRC
变量的定义中存在多余的不需要的空白:

LED-CFG-SRC := ../led-cfg/src/<there-is-reduntant-whitespace-here>
LED-CFG-SRC:=../LED-CFG/SRC/

这意味着,当稍后在规则定义中展开变量时,
make
将看到
。/led cfg/src/%.cc
(两个词,
$看看用
make print LED RGB SRC
打印的值。它说的是
。/LED/source/SRC/
,不是
。/LED cfg/SRC/
。在什么地方打字?对不起,我打印出了不同的变量。很好。我从来没有遇到过这样的问题,因为我的编辑器在保存时去掉了尾随的空格。这只是用定义的变量咬了我一口。)作为
VAR:=#VAR的描述
。永远不会猜到!
LED-CFG-SRC := ../led-cfg/src/<there-is-reduntant-whitespace-here>