2011-04-27 2 views
5

내 질문은 Targeting both 32bit and 64bit with Visual Studio in same solution/project과 (과) 비슷합니다.Visual Studio for C/C++에서 메이크 파일로 32 비트 및 64 비트 응용 프로그램을 동시에 컴파일하는 방법은 무엇입니까?

그러나 GNUmakefile에서이 작업을 수행해야합니다. 내가 gcc를 통해 32 비트 및 64 비트 응용 프로그램을 컴파일 교차하고 싶다면

예를 들어, 내가 컴파일 및 링크시 -m32 & -m64 플래그를 사용할 수 있습니다. 이 방법은 비주얼 스튜디오와 다릅니다. 왜냐하면 32 비트 용으로 컴파일하려면 vcvarsall.bat x86을, 컴파일 용 환경을 설정하려면 vcvarsall.bat x64을 64 비트 실행해야하기 때문입니다. 당신이 32 비트 및 64 비트의 컴파일 사이에 vcvarsall.bat 환경 스크립트를 다시 실행해야하기 때문에

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의 86을 실행 한 후 위의 샘플 메이크 파일을 컴파일하려고하면 64 비트 실행에 연결하려고 할 때, 나는이 오류를 얻을 것이다 :

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

를 우리가 구축 수행 할 수있는 방법이 있나요 32과 make를 한 번 호출하면 64 비트 응용 프로그램을 사용할 수 있습니까?

답변

5

에는 vcvars를 사용하는이 없습니다. 그것들은 하나의 플랫폼 환경 또는 다른 플랫폼 환경에서 구축하기위한 편리한 스크립트입니다. 명시 적으로 적절한 명령을 호출하고 적절한 옵션을 전달하면 두 개의 다른 배치 파일을 호출 할 필요없이 두 옵션을 모두 컴파일 할 수 있습니다.

는 여기에 GNU 메이크로 "foo는"프로그램 예를 작성하는 방법 중 하나입니다 :이 여전히 vcvarsall.bat x86 사전에 실행 된 가정합니다

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 $< 

하지만 더 많은 작업과 심지어는 제거 할 수있다.

+1

감사합니다. 컴파일하기 전에 vcvar를 실행하지 않은 경우 Windows SDK 포함 디렉터리와 Visual Studio VC 포함 디렉터리를 가리 키도록 INCLUDE 환경을 설정해야합니다. –

관련 문제