强制SCons在64位Windows上使用32位MSVC编译器

def*_*mer 6 scons cl

我正在尝试使用clVisual Studio 2010来构建32位版本的Mixxx.Mixxx使用SCons构建.我的计算机是Windows 7 64位,安装了太多版本的Visual Studio.

下面这些说明,我已经尝试了组合的各种和变化setenv以及vsvars但是不管我做什么,我结束了在这种情况下,在命令行:

> cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]
Run Code Online (Sandbox Code Playgroud)

好的,所以cl指向"版本16,x86" - 太棒了.

> scons toolchain=msvs force32=1 winlib=%cd%\winlib\x86 sqlitedll=0 staticlibs=1 asmlib=0

[... bunch of output truncated, until we start using the compiler ...]

cl /Fores\qrc_mixxx.obj /c res\qrc_mixxx.cc /TP /Zc:wchar_t- /GL /MP /fp:fast /G
[truncated]
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.
Run Code Online (Sandbox Code Playgroud)

(注意 - 我攻击了SCons删除了/nologo)什么?怎么cl现在的意思是"18版,64位"?它改变了我的环境吗?我们来看看:

Terminate batch job (Y/N)? y

>cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]
Run Code Online (Sandbox Code Playgroud)

所以cl仍然意味着"版本16,x86"到终端.但SCons总是使用"最新版本,x64".

(基于我对Windows shell的理解,这甚至不可能.我杀了脚本,所以它没有做任何清理.cl改变的意义怎么样?)

我发现了一些提示:

基于此,我补充道

Environment(MSVC_VERSION = '10.0')
Environment(TARGET_ARCH = 'x86')
print 'hello world'
Run Code Online (Sandbox Code Playgroud)

到SConstruct.我不知道SCons,并且构建脚本是非平凡的,所以很可能我做错了.无论如何,SCons仍然总是使用"最新版本,x64".

Raf*_*ter 6

你为我发布了工作环境(Scons 2.3.4):

env = Environment(
    MSVC_VERSION='12.0',
    TARGET_ARCH='x86')

env.Program('src.cpp')
Run Code Online (Sandbox Code Playgroud)

对于一个64位的程序的值应TARGET_ARCH='x86_64'根据http://scons.1086193.n5.nabble.com/32-and-64-bit-builds-on-MSVC-td25425.html.其他价值观MSVC_VERSION也有效.


def*_*mer 2

我根据 Dirkbaechle 的评论 ( ) 打开了日志记录set SCONS_MSCOMMON_DEBUG=-。这非常有帮助。当我添加Environment(MSVC_VERSION='10.0')到 SConstruct 时,我可以在输出中看到

get_default_version(): msvc_version:10.0 msvs_version:None
msvc_setup_env: using specified MSVC version '10.0'

[ ... truncated ... ]

get_default_version()
get_default_version(): msvc_version:None msvs_version:None
installed_vcs:['12.0', '10.0', '10.0Exp', '9.0']
msvc_setup_env: using default installed MSVC version '12.0'
Run Code Online (Sandbox Code Playgroud)

糟糕 - 当我们get_default_version第二次打电话时,我们似乎正在使用不同的环境。我不太了解 Mixxx 构建脚本,无法知道原因,但我很确定这就是原因。

简单的解决方法

对于像我这样懒得修复构建脚本的人来说,有一种简单(但丑陋)的方法可以强制 SCons 做你想做的事情。您只需要故意破坏您的新版本(当然是暂时的)。例如,我想使用2010,x86。首先,我重命名了所有高版本的“VC”目录。

  • C:\Program Files (x86)\Microsoft Visual Studio 12.0\ VC重命名为_DISABLED_VC
  • C:\Program Files (x86)\Microsoft Visual Studio 11.0\ VC重命名为_DISABLED_VC

现在 SCons 将使用 2010(又名“Microsoft Visual Studio 10.0”),因为所有更高版本均不可用。选择目标架构是类似的。

  • C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\ amd64重命名为_DISABLED_amd64
  • 对ia64x86_amd64x86_ia64等执行相同操作。