使用 C++ Makefile.win 检测 Windows 的 i386 与 x64?

Detecting i386 vs x64 for Windows with C++ Makefile.win?

抱歉,如果这个问题很明显,但我通常不会在 Windows 上编译 C++:

我正在尝试编写 Makefile.win,因此我需要 link 使用特定的 *dll。在需要link编辑的库子目录下,有/x64版本和/i386版本,即

.../libs/x64/library.dll
.../libs/i386/library.dll

对于 Linux 的 Makefile,我能够通过

简单地 link 到共享对象
SPECIAL_LIB= .../libs/library.so
LIBS=-L{SPECIAL_LIB}

但对于 windows,有 32 位版本 i386 和 64 位版本 x64

如何在Makefile.win中检测windowsOS是32位还是64位,只有link才能正确动态link 库(而不是其他)?类似于:

SPECIAL_LIB_32= .../libs/i386/library.dll
SPECIAL_LIB_64= .../libs/x64/library.dll
## check if 64-bit somehow
ifeq ($(strip $(OS)), "64bit machine")
        LIBS=-L{SPECIAL_LIB_32
endif

## check 32-bit
ifeq ($(strip $(OS)), "32bit machine")
        LIBS=-L{SPECIAL_LIB_64
endif

假设你的目标是主机,我相信你将不得不依赖环境变量。在我的 PC (Win10) 上 > echo %PROCESSOR_ARCHITECTURE% 产生 AMD64。根据 this 文章,它应该是 PROCESSOR_ARCHITEW6432,但事实并非如此。因此,在多个 Windows 版本上使用以下内容应该是相当安全的:

set(arch 0)
ifeq ($(OS),Windows_NT)
    CCFLAGS += -D WIN32
    ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
        set(arch 64 FORCE)
    else
        ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
            set(arch 64 FORCE)
        endif
        ifeq ($(PROCESSOR_ARCHITECTURE),x86)
            set(arch 32 FORCE)
        endif
    endif

然后在链接库时简单地将 ${SPECIAL_LIB}${arch} 连接起来,假设它们在您的 cmake 中被定义。