使用 CXX 查询预处理器定义?

Posted

技术标签:

【中文标题】使用 CXX 查询预处理器定义?【英文标题】:Use CXX to query preprocessor defines? 【发布时间】:2015-07-24 23:31:12 【问题描述】:

我有一个尊重CXXCXXFLAGS 的GNUmakefile。它还执行一些平台和架构测试。目前,makefile 假定主机和目标是相同的:

IS_X86 = $(shell uname -m | $(EGREP) -c "i.86|x86|i86|amd64")

为了提高健壮性,我想问问这些工具它的编译目的是什么。我想出了以下内容,但我不确定它是否正确。

$ export CXX=clang++
$ export CXXFLAGS="-DNDEBUG -g2 -O3 -m32"
$ $CXX $CXXFLAGS -dM -E - < /dev/null | egrep "(i386|x86_64)"
#define __i386 1
#define __i386__ 1
#define i386 1

$ export CXX=clang++
$ export CXXFLAGS="-DNDEBUG -g2 -O3"
$ $CXX $CXXFLAGS -dM -E - < /dev/null | egrep "(i386|x86_64)"
#define __x86_64 1
#define __x86_64__ 1

我的问题是,以上内容 - 使用 CXXCXXFLAGS - 是否能够可靠地检测目标?还是我需要别的东西?


这是我要问的两个原因。首先,我使用 Autotools 的经验表明有些不同。当 Autotools 执行上述测试时,他们会测试CPP,有时CPPCXX 需要包含--isysroot(或其他黑客)才能正确配置。

其次,一些工具链,比如 Clang,集成了其他组件(比如预处理器或汇编器),所以我不能在任何情况下直接使用 CPP

事实上,在使用其集成的汇编器时,在 Clang 下执行像 $CXX -Wa,-v - &lt;/dev/null(向汇编器询问其版本)这样简单的操作会导致“不支持的选项”错误。 (参见With integrated assembler enabled, fail to fetch version string of assembler)。


以防万一:这不是 Autools 或 Cmake 项目。它不使用 Boost 或任何其他库。它是一个独立的 C++03 项目。

【问题讨论】:

【参考方案1】:

我的问题是,上述方法(使用 CXX 和 CXXFLAGS)能否可靠地检测目标?

答案是是的,它会的。预处理器或编译器驱动程序(传递给预处理器)将主要产生预期的目标定义,而其他所有条件都相同。值得注意的例外是 GCC and ARMv8/Aarch64,它缺少大量预期的定义。

要避免的是uname -m(和朋友)。 Uname 报告主机信息,而不是目标信息。

【讨论】:

以上是关于使用 CXX 查询预处理器定义?的主要内容,如果未能解决你的问题,请参考以下文章

CQRS 命令/查询装饰器

为啥在预处理器定义中使用 if 语句?

使用预处理器指令定义输出路径

C#如何获取已定义预处理器的列表?

使用预处理器重新定义 for 循环

笔记3:预处理器-宏定义