使用 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 中被定义。
抱歉,如果这个问题很明显,但我通常不会在 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 中被定义。