Mar*_*inh 7 gnu-make visual-studio-2010 visual-studio
我的问题类似于在同一解决方案/项目中使用Visual Studio定位32位和64位.
但是,我需要在GNUmakefile中完成此操作.
例如,如果我想通过交叉编译32位和64位应用程序gcc,我可以在编译和链接期间使用-m32&-m64flags.这个方法对于visual studio是不同的,因为我必须运行vcvarsall.bat x86编译32位和vcvarsall.bat x6464位来设置我的环境进行编译.
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 $<
Run Code Online (Sandbox Code Playgroud)
上面的示例不起作用,因为您需要在32位和64位编译之间重新运行vcvarsall.bat环境脚本.如果我在运行vcvarsall.bat x86之后尝试编译上面的示例makefile,我会在尝试链接64位可执行文件时遇到此错误:
fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'
Run Code Online (Sandbox Code Playgroud)
有没有办法通过一次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 $<
Run Code Online (Sandbox Code Playgroud)
这仍然假设vcvarsall.bat x86是事先运行但更多的工作,甚至可以消除.
| 归档时间: |
|
| 查看次数: |
13619 次 |
| 最近记录: |