Windows makefiles中的环境变量

Windows makefiles中的环境变量,windows,makefile,mingw,environment-variables,Windows,Makefile,Mingw,Environment Variables,我使用的mingw32 make ifeq (%PROCESSOR_ARCHITECTURE%,AMD64) ARCH ?= 64 else ARCH ?= 32 endif 由于某些原因,处理器\u架构没有返回正确的值。我也尝试过$(处理器体系结构)和$(%PROCESSOR\u体系结构%)。不确定这里出了什么问题。就make而言,访问变量的正确语法是$(处理器体系结构) 在Linux上,符号应该是“导出”的,以便通过make访问,我不知道Windows上是否有类似的机制 或

我使用的
mingw32 make

ifeq (%PROCESSOR_ARCHITECTURE%,AMD64)
    ARCH ?= 64
else
    ARCH ?= 32
endif

由于某些原因,
处理器\u架构
没有返回正确的值。我也尝试过
$(处理器体系结构)
$(%PROCESSOR\u体系结构%)
。不确定这里出了什么问题。

make
而言,访问变量的正确语法是
$(处理器体系结构)

在Linux上,符号应该是“导出”的,以便通过
make
访问,我不知道Windows上是否有类似的机制

或者,您可以尝试以下语法:

ifeq "$(PROCESSOR_ARCHITECTURE)" "AMD64"
    ARCH ?= 64
else
    ARCH ?= 32
endif
另外,为了检查,请将此虚拟配方添加到makefile中:

show:
    @echo "PROCESSOR_ARCHITECTURE=$(PROCESSOR_ARCHITECTURE)"

然后在shell提示符下输入
make show

正如您在评论中发现并注意到的,对于32位应用程序,Windows会将
处理器体系结构设置为
x86
,即使它们实际上运行在64位操作系统上(我假设是为了应用程序兼容性)

如果您想让makefile确定底层OS类型,请先让它检查环境变量
PROCESSOR\u architecew6432
,它将告诉32位应用程序实际的OS架构

如果未设置
处理器架构W6432
,则返回到检查
处理器架构
。Windows仅在操作系统为64位且进程为32位时设置处理器\u架构W6432

ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
    ARCH ?= 64
endif

ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
    ARCH ?= 64
else
    ARCH ?= 32
endif

$(info $(ARCH))

echo%PROCESSOR\u ARCHITECTURE%
返回什么?(在shell中)。这很有趣,只需在makefile中的echo$(处理器体系结构)返回x86。我不知道为什么与仅在cmd shell中运行不同。根据我的发现,$(PROCESSOR_ARCHITECTURE)返回的不是cpu arch,而是编译应用程序的arch,因此使用32位make,它会返回32。在64位make中,它给出64。这很麻烦,因为即使是64位版本的MinGW也附带mingw32 make。不能说,我的操作系统没有这个变量。但我给出的答案合适吗?如果是,您能接受吗?不幸的是,问题不在于makefile本身,而在于所使用的变量。我还没有找到一个返回实际操作系统架构的变量,这个特定的变量只是返回编译make的架构,因为该变量是从make调用的。我已经求助于在Windows上简单地默认为32位。好吧,我误解了你的问题,我认为这是一些makefile语法问题。你能详细说明一下这些信息的来源吗?对于一个变量来说,这是一个多么有趣的名字…@kebs:这里有一些官方文档:然而,他们记录它的方式至少令人困惑,而且可以说是错误的。我假设该名称基于MS用于Wow64环境其他方面的Wow6432术语。