2011-04-27 54 views
5

我的问题与Targeting both 32bit and 64bit with Visual Studio in same solution/project类似。如何在Visual Studio for C/C++中的makefile中同时编译32位和64位应用程序?

但是,我需要在GNUmakefile中完成此操作。

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

all: foo.exe foo64.exe 

foo.exe: obj32/foo.o 
    link.exe /MACHINE:X86 $(OTHER_FLAGS) /out:[email protected] $^ 

foo64.exe: obj64/foo.o 
    link.exe /MACHINE:X64 $(OTHER_FLAGS) /out:[email protected] $^ 

obj32/foo.o: foo.c 
    cl.exe $(CFLAGS) $(INCLUDE_DIRS) /[email protected] /c $< 

obj64/foo.o: foo.c 
    cl.exe $(CFLAGS) $(INCLUDE_DIRS) /[email protected] /c $< 

上述样品是行不通的,因为你需要重新运行vcvarsall.bat环境脚本在32位和64位的编译之间。如果我尝试运行时86 vcvarsall.bat后编译上面的示例生成,我将要连结的64位可执行文件时出现此错误:

fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64' 

是否有我们可以完成建设路32和一个调用make的64位应用程序?

回答

5

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

这里是写你的“foo”的程序实例作为GNU生成文件的一种方法:

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:[email protected] $^ 

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

obj32/foo.obj: foo.c 
    "$(BIN32)/cl.exe" $(CFLAGS) $(INCLUDE_DIRS) /[email protected] /c $< 

obj64/foo.obj: foo.c 
    "$(BIN64)/cl.exe" $(CFLAGS) $(INCLUDE_DIRS) /[email protected] /c $< 

这仍然假定vcvarsall.bat x86事先被运行,但更多的工作,甚至可以消除。

+1

谢谢,就是这样!如果在编译之前未运行vcvar,则需要将INCLUDE环境设置为指向Windows SDK包含目录和Visual Studio VC包含目录。 – 2011-04-28 14:58:17

相关问题