2016-07-28 158 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

不錯的地方。我從來沒有遇到過這樣的問題,因爲我的編輯器在保存時刪除了尾隨空格。 –