如何在Visual Studio中使用makefile同时编译32位和64位的C/C++应用程序?

10

我的问题与在同一解决方案/项目中使用Visual Studio定位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:$@ $^

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

上面的示例无法工作,因为您需要在编译32位和64位之间重新运行vcvarsall.bat环境脚本。如果我在运行vcvarsall.bat x86后尝试编译上述示例makefile,则在尝试链接64位可执行文件时会收到此错误:

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

有没有一种方法可以在一次make调用中构建32位和64位应用程序?

1个回答

7

您不必使用vcvars。这些是为在一个平台环境或另一个平台上构建而设计的方便脚本。通过显式调用适当的命令并传递适当的选项,您可以编译两者而无需调用两个不同的批处理文件。

下面是一种将您的“foo”程序示例编写为GNU makefile的方法:

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,但通过更多的工作甚至可以消除这一点。


1
谢谢,就是这样!如果在编译之前没有运行vcvar,则需要将INCLUDE环境设置为指向Windows SDK包含目录和Visual Studio VC包含目录。 - Mark Trinh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接