#ifdef 和 Makefile 中的条件编译

3

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

在我的情况下,我的src_file.c包含:

#ifndef WITH_ATS
#define WITH_ATS
#include "ats.h"
#endif

并且Makefile包含:

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

我尝试的是,如果我执行make WITH_ATS=1,文件应该编译并链接到已编译的ats库, 而如果我执行make WITH_ATS=0,则应该在没有ats库的情况下进行编译。任何帮助将不胜感激。

Makefile中不要使用条件编译,只在C源文件中使用。你可能会为make生成依赖关系,但那是一个非常不同的问题。 - Basile Starynkevitch
1
我知道这不是你要问的,但与其使用GNU make的ifdef,不如考虑使用可移植的Makefile结构和习惯用法,正如A tutorial on portable Makefiles所解释的那样。 - imhotap
这不是一个完整的问题。你遇到了什么问题? - Vroomfondel
@imhotap 感谢你的教程。对我来说将是极大的帮助。 - Zeta
2个回答

7

Makefile

当运行make WITH_ATS=0时,变量WITH_ATSnot empty,因此makefile中的ifdef WITH_ATS将被评估为true(即不是您预期的结果)。

实际上,您需要检查WITH_ATS是否等于1。这可以通过ifeq实现:

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

C源代码文件

在您的src_file.c中,您既不需要#ifndef也不需要#define。以这种方式实现的是包含保护,而不是您所需的内容,您实际上需要的是:

#ifdef WITH_ATS
#include "ats.h"
#endif

即,如果定义了WITH_ATS,则需要包含ats.h
请注意,在您的C源文件中,WITH_ATS只是一个空宏(即,它没有任何关联值),而在您的makefile中,WITH_ATS是一个变量,它接受命令行传递的值,例如,0表示make WITH_ATS=0

1
使用if代替ifdef
#if WITH_ATS
#include "ats.h"
#endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接