Makefile中的变量使用

时间:2021-08-03 13:23:04

我想我都开始犯糊涂了。今天折腾了一个Makefile的文件,怎么写都有问题,后来发现竟然把变量和变量值这两个概念弄混了。
具体来说,正确的Makefile应该是下面这个样子的:

TARGET=test
SRC=main.c

CC=gcc

CFLAGS =-I./lib2 -I./lib1
LDFLAGS = -L./lib2 -L./lib1

LIBRARYS += -la2 -la1

LDFLAGS += $(LIBRARYS)

.PHONY: all clean


all: $(TARGET)

$(TARGET):
$(CC) $(SRC) $(CFLAGS) $(LDFLAGS) -o $@


clean:
@rm -f $(TARGET)

目的是编译main.c这个文件,它调用了liba2.a这个库,而liba2.a这个库又调用了liba1.a这个库。所以需要指定liba2.a的路径和对应的头文件路径。我当时想把LIBRARYS这个变量的值添加到LDFLAGS里面去,一拍脑门写成了:

$(LDFLAGS)+=$(LIBRARYS)

结果在执行make时就总是提示找不到liba2.a这个文件,当时就奇怪了,告诉它要链接liba2.a了啊,怎么不连接呢?折腾了半天后把LDFLAGS的值打印出来一看,果然是没有-la2这个链接选项,仔细看Makefile才发现,上面的赋值语句是错误的,正确的应该是:

LDFLAGS+=$(LIBRARYS)

我期望做的是给一个变量赋值,而不是给这个变量多存储的值赋值,况且这个也不是指针变量,根本就不能这么用。
结果了为了这点破事儿折腾了好半天,艹。

还有一点是,如果库2调用了库1,儿execute调用了库2,那么在编译execute的时候需要把库1和库2都链接起来,否则只链接库2的话,会提示编译失败,无法找到库1。 之所以这么说,是因为我当时以为在编译库2的时候,已经将库1的路径和库文件写到库2的Makefile里面了,库2应该就已经包含库1了,但实际情况根部不是我想的那么回事。 谨记。