gpt4 book ai didi

c - #ifdef 和使用 Makefile 的条件编译

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:41 24 4
gpt4 key购买 nike

在询问之前我已经看到了这个,尝试过但没有帮助: conditional compliation based on variable into makefile

在我的例子中,我的 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 lib 进行编译,而如果 make WITH_ATS=0 编译应该没有 ats 库。

我们将不胜感激。

最佳答案

生成文件

变量 WITH_ATSnot empty当运行 make WITH_ATS=0 时,因此 makefile 中的 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

C源文件

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

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

也就是说,如果定义了 WITH_ATS,则包含 ats.h

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

关于c - #ifdef 和使用 Makefile 的条件编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50329451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com