#ifdef 和条件编译与 Makefile

Zet*_*eta 3 c makefile compilation gnu-make

在问之前我看到了这个,尝试但没有帮助: 基于变量的条件编译到makefile

就我而言,我src_file.c包含:

#ifndef WITH_ATS
#define WITH_ATS
#include "ats.h"
#endif
Run Code Online (Sandbox Code Playgroud)

而 Makefile 有:

ifdef WITH_ATS
INCLUDEDIR += -I../at2_build/include/
LDFLAGS += -L$(AT2) -lat2 -Wl,-rpath=$(AT2)
CFLAGS += -DWITH_ATS
endif
Run Code Online (Sandbox Code Playgroud)

我正在尝试的是,如果我做make WITH_ATS=1文件应该用编译的atslib编译,而如果make WITH_ATS=0编译应该没有atslib。

任何帮助将不胜感激。

眠りネ*_*ネロク 7

生成文件

变量WITH_ATS不是空运行的时候make WITH_ATS=0,因此ifdef WITH_ATS在生成文件的计算结果为真(即,不是你所期望的)。

你真正需要的是检查是否WITH_ATS等于1。这可以通过以下方式实现ifeq

ifeq ($(WITH_ATS),1)
INCLUDEDIR += -I../at2_build/include/
LDFLAGS += -L$(AT2) -lat2 -Wl,-rpath=$(AT2)
CFLAGS += -DWITH_ATS
endif
Run Code Online (Sandbox Code Playgroud)

C源文件

在你的src_file.c你不需要#ifndef也不需要#define。您正在以这种方式实现的是include guard,这不是您想要的,您实际需要的是:

#ifdef WITH_ATS
#include "ats.h"
#endif
Run Code Online (Sandbox Code Playgroud)

也就是说,包含ats.hifWITH_ATS已定义。

请注意,在您的 C 源文件中,WITH_ATS它只是一个空宏(即,它没有任何关联的值),而在您的 makefile 中,WITH_ATS是一个变量,它接受在命令行传递的值,例如0for make WITH_ATS=0