2016-07-28 154 views
0

我有一个简单的Makefile。当我不在依赖列表中使用变量时,它工作正常。否则,它给休耕错误: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 

所以值设置正确,altough如果我明确的补充规则,此文件:

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

它看起来像问题是用LED-CFG-SRC源文件:

make ext/configXML.o 
make: *** No rule to make target '/configXML.cc', needed by 'ext/configXML.o'. Stop. 

但该文件存在:

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 [email protected] $^ 



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


    clean: 
     rm -rf $(EXTOBJS) 

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

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


    .PHONY: clean dirs 

我使用GNU使在黑暗4.1

+0

看看用'make print-LED-RGB-SRC'打印的值。它说'../ LED/source/src /',而不是'../ led-cfg/src /'。错别的地方? – Kusalananda

+0

对不起,我已经打印出不同的变量。 –

回答

1

射击。至少在Makefile列出了已经发布的,还有在LED-CFG-SRC变量的定义冗余不需要的空白:

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

这意味着,当变量在后面的规则定义扩大,make会看到../led-cfg/src/ %.cc (两个字,$< = ../led-cfg/src/%.cc仅作为附加依赖项)而不是预期的../led-cfg/src/%.cc

你应该激活在你的编辑器中显示不可打印的字符,因为make对于空格非常挑剔:有些选择自动剥离,但有些保留。像这样:make已经在../led-cfg/src/的前面规定了空格,但是它保留了最后一个。

+0

不错的地方。我从来没有遇到过这样的问题,因为我的编辑器在保存时删除了尾随空格。 –