makefile始终调用最后一个目标

sg7*_*777 1 c openssl makefile wolfssl

这是我的makefile.

#starts here
#Openssl constants
Openssl_include=-I/usr/local/openssl/include
Openssl_lib=-L/usr/local/openssl/lib -lcrypto -ldl
#Wolfssl constants
Wolfssl_include=-I/usr/local/wolfssl/include -LLIBDIR -DWOLFSSL_SHA512
Wolfssl_lib=-L/usr/local/wolfssl/lib -lwolfssl
#Mbedssl constants 
Mbedssl_include=-I/usr/local/mbedssl/include
Mbedssl_lib=-L/usr/local/mbedssl/lib -lmbedcrypto

SRC=CAL_aes.c CAL_sha.c CAL_cmac.c CAL_rsa.c
OBJ=$(patsubst %.c,%.o,$(SRC))
M_OBJ=$(patsubst %.c,M_%.o,$(SRC))
M_fpic_OBJ=$(patsubst %.c,M_fpic_%.o,$(SRC))

O_OBJ=$(patsubst %.c,O_%.o,$(SRC))
O_fpic_OBJ=$(patsubst %.c,O_fpic_%.o,$(SRC))

W_OBJ=$(patsubst %.c,W_%.o,$(SRC))
W_fpic_OBJ=$(patsubst %.c,W_fpic_%.o,$(SRC))

.PHONY: clean Openssl Wolfssl Mbedssl compile_openssl compile_wolfssl compile_mbedssl
compile_openssl: $(OBJ)  
%.o: %.c
    cc -c $^ -o $(patsubst $@,O_$@,$@) $(Openssl_include) $(Openssl_lib)
    cc -c -fpic $^ -o $(patsubst $@,O_fpic_$@,$@) $(Openssl_include) $(Openssl_lib)
Openssl: compile_openssl
    ar rc libO_CAL_crypto.a $(O_OBJ)
    cc -shared -o libO_CAL_crypto.so $(O_fpic_OBJ)
compile_wolfssl: $(OBJ)  
%.o: %.c
   cc -c $^ -o $(patsubst $@,W_$@,$@) $(Wolfssl_include) $(Wolfssl_lib)
   cc -c -fpic $^ -o $(patsubst $@,W_fpic_$@,$@) $(Wolfssl_include) $(Wolfssl_lib)
Wolfssl: compile_wolfssl
        ar rc libW_CAL_crypto.a $(W_OBJ)
        cc -shared -o libW_CAL_crypto.so $(W_fpic_OBJ)
compile_mbedssl: $(OBJ)  
    %.o: %.c
        cc -c $^ -o $(patsubst $@,M_$@,$@) $(Mbedssl_include) $(Mbedssl_lib)
        cc -c -fpic $^ -o $(patsubst $@,M_fpic_$@,$@) $(Mbedssl_include) $(Mbedssl_lib)
Mbedssl: compile_mbedssl
        ar rc libM_CAL_crypto.a $(M_OBJ)
        cc -shared -o libM_CAL_crypto.so $(M_fpic_OBJ)
    #ends here
Run Code Online (Sandbox Code Playgroud)

无论我是否打电话给Make Openssl,Make Wolfssl或Make Mbedssl.永远是目标Make Mbedssl被召唤.我尝试重新排列目标,并且无论我从命令行传递的目标是什么,都会调用最后一个位置的目标.谢谢.

Mad*_*ist 5

您似乎试图声明模式规则的多个实例,%.o : %.c因此它们会有不同的影响,具体取决于它们在makefile中的显示位置.那是不可能的.Make在开始处理任何目标之前首先读取整个makefile,并且它对所有规则只有一个"范围".

如果重新定义模式规则,%.o : %.c则删除旧规则,新规则将对所有查找生效.

因此,%.o : %.c模式的最后一个实例是对所有.o目标查找有效的实例,并删除所有先前的规则.

我建议您查看特定目标的变量,这些变量可能对您的实现有所帮助.