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

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

我的问题类似于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位应用程序的工作?

最佳答案

您没有拥有来使用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是事先运行的,但是即使可以消除它,也需要做更多的工作。

关于visual-studio - 如何在Visual Studio for C/C++中的makefile中同时编译32位和64位应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5807647/

相关文章:

makefile - 从 Makefile 检查程序是否存在

makefile - 在 Makefile 中, "VARIABLE = value"是否等于“VARIABLE=value?

c# - 将 'Surrounds With' 类型代码片段添加到现有集合

c++ - 如何在 Microsoft Visual Studio 中加载 .xml 文件

java - 导入org.junit.jupiter无法解析

c++ - 无法使 MySQL 连接器/C++ 工作 - 未处理的异常 (sql::SQLException) Visual Studio 2010

visual-studio-2010 - 在 Visual Studio 中跟踪更改、更新和 TODO

Makefile:带有默认参数的宏

asp.net - 构建时出现对象引用错误,但是…没有位置?

asp.net - 为什么在智能感知中找不到某些属性?