2011-04-27 242 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