使用 CXX 查询预处理器定义?
Posted
技术标签:
【中文标题】使用 CXX 查询预处理器定义?【英文标题】:Use CXX to query preprocessor defines? 【发布时间】:2015-07-24 23:31:12 【问题描述】:我有一个尊重CXX
和CXXFLAGS
的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
我的问题是,以上内容 - 使用 CXX
和 CXXFLAGS
- 是否能够可靠地检测目标?还是我需要别的东西?
这是我要问的两个原因。首先,我使用 Autotools 的经验表明有些不同。当 Autotools 执行上述测试时,他们会测试CPP
,有时CPP
或CXX
需要包含--isysroot
(或其他黑客)才能正确配置。
其次,一些工具链,比如 Clang,集成了其他组件(比如预处理器或汇编器),所以我不能在任何情况下直接使用 CPP
。
事实上,在使用其集成的汇编器时,在 Clang 下执行像 $CXX -Wa,-v - </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 查询预处理器定义?的主要内容,如果未能解决你的问题,请参考以下文章