Как вы одновременно компилируете 32-битные и 64-битные приложения в Visual Studio для C / C ++ в make-файле?

Мой вопрос похож на Ориентация на оба 32-битных и 64-разрядная версия с Visual Studio в одном решении / проекте.

Однако мне нужно сделать это в файле GNUmakefile.

Например, если я хочу перекрестно компилировать 32- и 64-битные приложения через gcc, я могу использовать флаги -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:$@ $^

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

Приведенный выше пример не будет работать, потому что вам нужно повторно запустить сценарий среды vcvarsall.bat между компиляцией 32- и 64-разрядной версии. Если я попытаюсь скомпилировать приведенный выше образец make-файла после запуска vcvarsall.bat x86, я получу эту ошибку при попытке связать 64-битный исполняемый файл:

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

Есть ли способ собрать как 32-, так и 64-разрядные приложения с помощью одного вызова make?


person Mark Trinh    schedule 27.04.2011    source источник


Ответы (1)


Вам не нужно использовать 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:$@ $^

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

Это по-прежнему предполагает, что vcvarsall.bat x86 был запущен заранее, но с дополнительными работами, которые могут быть устранены.

person Rick Sladkey    schedule 28.04.2011
comment
Спасибо, вот и все! Если вы не запускали vcvar перед компиляцией, вам необходимо настроить среду INCLUDE так, чтобы она указывала на каталог include Windows SDK, а также на каталог include VC Visual Studio. - person Mark Trinh; 28.04.2011