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

时间:2014-07-17 18:01:22

标签: scons cl

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

关注these instructions,我尝试了setenvvsvars的各种组合和变体,但无论我做什么,我都会在这种情况下进入命令行:< / p>

> 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... ]

好的,所以cl指向&#34;版本16,x86&#34; - 很棒。

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

(注意 - 我攻击SCons删除/nologo)什么? cl现在如何表示&#34;版本18,x64&#34;?它改变了我的环境吗?让我们来看看:

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... ]

所以cl仍然意味着&#34;版本16,x86&#34;到终点站。但SCons总是使用&#34;最新版本,x64&#34;。

(根据我对Windows shell的理解,这甚至不可能。我杀了脚本,所以它没有做任何清理。cl的含义如何改变那样的?)

我发现了一些提示:

基于此,我已添加

Environment(MSVC_VERSION = '10.0')
Environment(TARGET_ARCH = 'x86')
print 'hello world'

到SConstruct。我不了解SCons,构建脚本也不重要,所以我很可能做错了。无论如何,SCons仍然总是使用&#34;最新版本,x64&#34;。

3 个答案:

答案 0 :(得分:6)

The Environment kwargs你为我发布了工作(Scons 2.3.4):

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

env.Program('src.cpp')

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

答案 1 :(得分: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'

哎呀 - 当我们第二次打电话给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
  • ia64 x86_amd64 x86_ia64 等做同样的事情。

答案 2 :(得分:-1)

我尝试使用env = Environment(blabla)设置TARGET_ARCH,但没有帮助

因此,我在Scons目录(... \ PythonDir \ scons-3.0.1 \ Scons)中搜索“ TARGET_ARCH”。 就我而言,它位于 Environment.py 文件中,该文件具有包含默认值的部分。 我将 None 更改为'x86'

# Now set defaults for TARGET_{OS|ARCH}
...
# self._dict['TARGET_ARCH']    = self._dict.get('TARGET_ARCH',None)
self._dict['TARGET_ARCH']    = self._dict.get('TARGET_ARCH','x86')

然后我删除了先前编译的 Environment.pyc ,使其重新生成

成功了!