【发布时间】: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 项目。
【问题讨论】:
标签: c++ macros c-preprocessor