1:先记录一下makefile中如何使用宏定义:
在看mosqutto代码时候,各种根据宏定义执行不同的流程,如:
#ifdef WITH_TLS
else
endif
#ifdef WITH_BRIDGE
else
endif
#ifdef WITH_WEBSOCKETS
else
endif
但是找了半天又没发现这些宏在什么地方,最后在src目录下的config.mk中看到有关于一些宏的配置:
可以配置yes或no。接下来可能会好奇,这些配置又没有在C文件中写成#define WITH_TLS等。程序是如何根据宏定义走不通路径的。这就牵扯到在makefile中如何使用宏定义的问题。
写一个最简单的c程序,根据是否定义了SERVER宏,进行不同的输出。
int main()
{
#ifdef SERVER
printf("work in server mode\n");
#else
printf("work in client mode\n");
#endif
return 0;
}
我们写这样一个makefile,然后执行make进行编译,
CFLAGS += -DSERVER
TARGETS := myapp
all:$(TARGETS)
$(TARGETS):main.c
$(CC) $(CFLAGS) $^ -o $@
clean:
-$(RM) -f *.o
-$(RM) -f $(TARGETS)
执行 make clean all 然后生成了myapp,执行输出work in server mode.
CFLAGS += -DSERVER 这一句就是定义了SERVER宏 -D是define的意思。