Visual studio 如何在Visual Studio for C/C+中同时编译32位和64位应用程序+;在makefile中?

Visual studio 如何在Visual Studio for C/C+中同时编译32位和64位应用程序+;在makefile中?,visual-studio,visual-studio-2010,gnu-make,Visual Studio,Visual Studio 2010,Gnu Make,我的问题类似于 但是,我需要在gnumake文件中完成这项工作 例如,如果我想通过gcc交叉编译32位和64位应用程序,我可以在编译和链接期间使用-m32&-m64标志。对于visual studio,此方法不同,因为我必须运行vcvarsall.bat x86以编译32位,运行vcvarsall.bat x64以设置编译环境 all: foo.exe foo64.exe foo.exe: obj32/foo.o link.exe /MACHINE:X86 $(OTHER_FLAGS)

我的问题类似于

但是,我需要在gnumake文件中完成这项工作

例如,如果我想通过
gcc
交叉编译32位和64位应用程序,我可以在编译和链接期间使用
-m32
&
-m64
标志。对于visual studio,此方法不同,因为我必须运行
vcvarsall.bat x86
以编译32位,运行
vcvarsall.bat x64
以设置编译环境

all: foo.exe foo64.exe

foo.exe: obj32/foo.o
    link.exe /MACHINE:X86 $(OTHER_FLAGS) /out:$@ $^

foo64.exe: obj64/foo.o
    link.exe /MACHINE:X64 $(OTHER_FLAGS) /out:$@ $^

obj32/foo.o: foo.c
    cl.exe $(CFLAGS) $(INCLUDE_DIRS) /Fo$@ /c $<

obj64/foo.o: foo.c
    cl.exe $(CFLAGS) $(INCLUDE_DIRS) /Fo$@ /c $<

有没有一种方法可以通过一次make调用同时构建32位和64位应用程序?

您没有使用vcvar。这些是在一个或另一个平台环境中构建的方便脚本。通过显式调用适当的命令并向它们传递适当的选项,您可以编译这两个命令,而无需调用两个不同的批处理文件

以下是将“foo”程序示例编写为GNU makefile的一种方法:

BIN32 = $(VS100COMNTOOLS)..\..\vc\bin
BIN64 = $(VS100COMNTOOLS)..\..\vc\bin\amd64
LIB32 =
LIB64 = \
    /libpath:"$(VS100COMNTOOLS)..\..\vc\lib\amd64" \
    /libpath:"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib\x64"

all: foo.exe foo64.exe

foo.exe: obj32/foo.obj
    "$(BIN32)/link.exe" /MACHINE:X86 $(OTHER_FLAGS) $(LIB32) /out:$@ $^

foo64.exe: obj64/foo.obj
    "$(BIN64)/link.exe" /MACHINE:X64 $(OTHER_FLAGS) $(LIB64) /out:$@ $^

obj32/foo.obj: foo.c
    "$(BIN32)/cl.exe" $(CFLAGS) $(INCLUDE_DIRS) /Fo$@ /c $<

obj64/foo.obj: foo.c
    "$(BIN64)/cl.exe" $(CFLAGS) $(INCLUDE_DIRS) /Fo$@ /c $<
BIN32=$(VS100COMNTOOLS)\..\vc\bin
BIN64=$(VS100COMNTOOLS)\..\vc\bin\amd64
LIB32=
LIB64=\
/libpath:“$(VS100COMNTOOLS)\..\vc\lib\amd64”\
/libpath:“C:\ProgramFiles(x86)\Microsoft SDK\Windows\v7.0A\lib\x64”
全部:foo.exe foo64.exe
foo.exe:obj32/foo.obj
“$(BIN32)/link.exe”/MACHINE:X86$(其他_标志)$(LIB32)/out:$@$^
foo64.exe:obj64/foo.obj
“$(BIN64)/link.exe”/MACHINE:X64$(其他_标志)$(LIB64)/out:$@$^
obj32/foo.obj:foo.c
“$(BIN32)/cl.exe”$(CFLAGS)$(INCLUDE_DIRS)/Fo$@/c$<
obj64/foo.obj:foo.c
“$(BIN64)/cl.exe”$(CFLAGS)$(INCLUDE_DIRS)/Fo$@/c$<

这仍然假设
vcvarsall.bat x86
是预先运行的,但需要做更多的工作,甚至可以省去这些工作。

谢谢,就这样!如果在编译之前没有运行vcvar,则需要将INCLUDE环境设置为指向Windows SDK INCLUDE目录和Visual Studio VC INCLUDE目录。
BIN32 = $(VS100COMNTOOLS)..\..\vc\bin
BIN64 = $(VS100COMNTOOLS)..\..\vc\bin\amd64
LIB32 =
LIB64 = \
    /libpath:"$(VS100COMNTOOLS)..\..\vc\lib\amd64" \
    /libpath:"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib\x64"

all: foo.exe foo64.exe

foo.exe: obj32/foo.obj
    "$(BIN32)/link.exe" /MACHINE:X86 $(OTHER_FLAGS) $(LIB32) /out:$@ $^

foo64.exe: obj64/foo.obj
    "$(BIN64)/link.exe" /MACHINE:X64 $(OTHER_FLAGS) $(LIB64) /out:$@ $^

obj32/foo.obj: foo.c
    "$(BIN32)/cl.exe" $(CFLAGS) $(INCLUDE_DIRS) /Fo$@ /c $<

obj64/foo.obj: foo.c
    "$(BIN64)/cl.exe" $(CFLAGS) $(INCLUDE_DIRS) /Fo$@ /c $<