Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么makefile不能正常工作?_Makefile - Fatal编程技术网

为什么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

我有一个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 $(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