【问题标题】:How do you compile 32-bit and 64-bit applications at the same time in Visual Studio for C/C++ in a makefile?如何在 Visual Studio for C/C++ 的 makefile 中同时编译 32 位和 64 位应用程序?
【发布时间】:2011-08-14 00:56:48
【问题描述】:

我的问题类似于Targeting both 32bit and 64bit with Visual Studio in same solution/project

但是,我需要在 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 位应用程序?

【问题讨论】:

    标签: visual-studio visual-studio-2010 gnu-make


    【解决方案1】:

    您没有使用 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 是预先运行的,但有更多的工作甚至可以消除。

    【讨论】:

    • 谢谢,就是这样!如果在编译之前没有运行 vcvar,则需要将 INCLUDE 环境设置为指向 Windows SDK 包含目录和 Visual Studio VC 包含目录。
    猜你喜欢
    • 2020-11-25
    • 2011-10-25
    • 1970-01-01
    • 2018-02-26
    • 2012-01-18
    • 1970-01-01
    • 2011-11-10
    • 2018-09-04
    • 2014-04-18
    相关资源
    最近更新 更多