c++ - Makefile 中的条件表达式

标签 c++ if-statement makefile conditional-expressions

我知道您可以在 makefile 中使用如下 if 语句:

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

有没有办法像三元类型运算符那样进行条件替换。

(condition?$(CC):$(CC2)) -o foo $(objects) $(libs_for_gcc)  

如果没有什么是实现该示例的最惯用的方法

我添加了 c++ 标签,因为这个问题只有 7 个 View ,我认为使用 c++ 的人可能知道答案,我知道这不是一个严格的 c++ 问题(尽管我打算用它编译 c++ )

编辑: 看起来有一个使用此语法的 if 函数
$(if condition,then-part[,else-part])
不过,我对它的工作原理还是有点困惑

最佳答案

正如您所发现的,$(if ...) 函数可以用作三元运算符。真正的问题是,条件(真与假)在 GNU make 中是如何工作的?在 GNU make 中,任何需要条件( bool 表达式)的地方,空字符串都被认为是 false,任何其他值都被认为是 true。

因此,要测试 $(CC) 是否是字符串 gcc,您需要使用一个函数,当它不是时返回一个空值, 和一个非空值。

通常 filterfilter-out 函数用于此。不幸的是,最容易以得到“不相等”结果的方式使用它们;换句话说,如果字符串是 not gcc,则使用这些函数可以更简单地准确生成非空字符串 (true),如果是,则生成空字符串 (false)值 gcc。例如:

$(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc))

关于c++ - Makefile 中的条件表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17979926/

相关文章:

c++ - LNK2038 : mismatch detected for 'RuntimeLibrary' : value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in main.obj

c++ - 带有 C++ 解决方案的 C 库

objective-c - if 语句没有按我的预期工作

sql - 对一个表中的值使用 if else 将数据插入另一个表

C- 整个文件夹的 Makefile

makefile - 我可以使 makefile 在规则之外中止吗?

c - 如何从 C 程序创建 makefile?

c++ - 异常段错误

php - MySQL 插入,在 PHP 中比 C++ 更快,这是预期的吗?

python - 生成任意数量的 if 语句和字典索引