Makefile与#ifdef条件编译问题:WITH_ATS变量控制编译逻辑
解决Makefile条件编译匹配WITH_ATS值的问题
我来帮你搞定这个条件编译的问题~咱们先揪出当前的两个核心问题:
问题1:Makefile的ifdef逻辑不对
你用的ifdef WITH_ATS是判断变量是否存在,而不是判断变量的值。哪怕你传WITH_ATS=0,这个变量是存在的,所以ifdef依然会触发里面的编译链接规则,这就和你想要的效果完全相反了。
问题2:src_file.c的头文件包含逻辑错误
你写的#ifndef WITH_ATS紧接着又#define WITH_ATS,这会导致不管编译时有没有定义WITH_ATS,最终都会包含ats.h——等于完全没做条件控制。
修正后的代码
1. 调整Makefile的条件判断
把ifdef改成ifeq,精准判断变量的值是否为1:
ifeq ($(WITH_ATS),1) 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或者直接make时,这些规则都不会生效。
2. 修正src_file.c的头文件包含逻辑
改成只有当编译时定义了WITH_ATS,才包含头文件:
#ifdef WITH_ATS #include "ats.h" #endif
如果你的需求是默认包含ATS,只有传WITH_ATS=0时才关闭,可以改成这样:
#if !defined(WITH_ATS) || (WITH_ATS != 0) #include "ats.h" #endif
测试验证
- 执行
make WITH_ATS=1:程序会携带ATS库编译,同时包含ats.h头文件 - 执行
make WITH_ATS=0或make:不会链接ATS库,也不会包含ats.h
内容的提问来源于stack exchange,提问作者Zeta
相关产品推荐
相关产品推荐

