Makefile 依赖变量
Makefile dependencies variable
我有一个简单的 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 "$@" "$<"
看起来问题出在源文件的 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 $@ $^
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
我正在使用 GNU Make 4.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/
前面的空格,但它保留了末尾的空格。
我有一个简单的 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 "$@" "$<"
看起来问题出在源文件的 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 $@ $^
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
我正在使用 GNU Make 4.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/
前面的空格,但它保留了末尾的空格。