【问题标题】:Use CXX to query preprocessor defines?使用 CXX 查询预处理器定义?
【发布时间】: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 项目。

【问题讨论】:

    标签: c++ macros c-preprocessor


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多