为什么makefile不能正常工作?
我有一个makefile:为什么makefile不能正常工作?,makefile,Makefile,我有一个makefile: src = $(notdir $(wildcard src/*.cpp)) obj = $(src:.cpp=.o) libname ?= libtest importlib_flags = -ldl -lboost_filesystem parser: $(obj) g++ -o $@ $^ %.o: src/%.cpp ifeq ($<,src/$(libname).cpp) g++ -fpic -c $(libname).cpp -o
src = $(notdir $(wildcard src/*.cpp))
obj = $(src:.cpp=.o)
libname ?= libtest
importlib_flags = -ldl -lboost_filesystem
parser: $(obj)
g++ -o $@ $^
%.o: src/%.cpp
ifeq ($<,src/$(libname).cpp)
g++ -fpic -c $(libname).cpp -o $(libname).o
g++ -shared -Wl,-soname,$(libname).so.1 -o $(libname).so.1.0.1 $(libname).o -lc
else
g++ -c $< -o $@ $(if $(findstring importlib, $<), $(importlib_flags))
endif
.PHONY: clean
clean:
rm -rf *.o *.so* parser
SHELL:=/bin/bash
第一行意味着makefile转到else分支,但它应该转到ifeq,因为$<扩展到src/libtest.cpp,它在扩展后等于src/$libname.cpp。我没有通过命令行设置libname。为什么不起作用?IIRC扩展发生在规则实际运行之前,因此$the扩展发生在规则实际运行之前不要混淆运行前扩展和第一次运行时扩展。配方规则主体在运行前被扩展,$@Matt感谢您的澄清,我没有很清楚地解释它。我试图使用简单的方法,但可能失败。当然,最好的做法是为$libname.o案例编写一个单独的、特定的规则,从而完全消除条件。另一个是$libname.so.1.0.1,而不是将其作为另一个目标规则的额外输出。
%.o: src/%.cpp
if [[ "$<" == "src/$(libname).cpp" ]] ; then \
g++ -fpic -c $(libname).cpp -o $(libname).o ; \
g++ -shared -Wl,-soname,$(libname).so.1 -o $(libname).so.1.0.1 $(libname).o -lc ; \
else \
g++ -c $< -o $@ $(if $(findstring importlib, $<), $(importlib_flags)) ; \
fi
SHELL:=/bin/bash