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

Мой вопрос похож на Ориентация как на 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?

1 Ответ

6 голосов
/ 28 апреля 2011

У вас нет для использования vcvars. Это удобные сценарии для построения в одной платформе или другой среде. Явно вызывая надлежащие команды и передавая им соответствующие параметры, вы можете скомпилировать обе команды без необходимости вызова двух разных пакетных файлов.

Вот один из способов написать пример программы "foo" в виде make-файла 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 был запущен заранее, но с большей работой, которую можно устранить.

...