【问题标题】:Force SCons to use 32-bit MSVC compiler on 64-bit Windows强制 SCons 在 64 位 Windows 上使用 32 位 MSVC 编译器
【发布时间】:2014-07-17 18:01:22
【问题描述】:

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

these instructions 之后,我尝试了setenvvsvars 的各种组合和变体,但无论我做什么,在这种情况下我最终都在命令行上:

> 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 指向“版本 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.

(注意 - 我破解了 SCons 以删除 /nologo)什么? cl 现在如何表示“版本 18,x64”?它改变了我的环境吗?让我们找出答案:

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 对终端仍然意味着“版本 16,x86”。但 SCons 总是使用“最新版本,x64”。

(根据我对Windows shell的理解,这应该是不可能的。我杀了脚本,所以它没有做任何清理。cl的含义怎么会变成那样?)

我发现了一些提示:

基于此,我添加了

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

到 SConstruct。我不知道 SCons,而且构建脚本很重要,所以很可能我做错了。无论如何,SCons 仍然总是使用“最新版本,x64”。

【问题讨论】:

  • 您是否已经尝试联系 Mixxx 项目的维护人员解决此问题?在这种情况下,他们可能会提供最好的帮助......
  • 是的,我已发布到邮件列表here。我想我应该已经包含了这个链接。
  • 尝试按照comments.gmane.org/gmane.comp.programming.tools.scons.user/… 的说明启用MSVS 初始化过程的调试。如果其他调试消息没有告诉您任何信息,请将您的问题和调试输出发布到 SCons 用户 ML (scons-users@scons.org)。
  • 非常感谢,调试技巧正是我所需要的!

标签: scons cl


【解决方案1】:

您发布的环境 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 的其他值也可以使用。

【讨论】:

    【解决方案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
    • ia64x86_amd64x86_ia64 等执行相同操作。

    【讨论】:

    • 最好在环境初始化中使用 TARGET_ARCH 变量,如下所示。你在“简单的解决方法”中所做的可能会破坏那些 Visual Studio 安装..
    • @bdbaddog - 是的,这个答案提出了一种解决方法,绝对会破坏那些 Visual Studio 安装。但是,这比在您不了解 scons 时尝试修复数千行构建脚本要容易。
    • 这就是为什么如果您遇到困难应该去项目支持资源。我们非常愿意提供帮助。在这里、IRC 或用户邮件列表。
    【解决方案3】:

    我尝试使用 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,导致重新生成

    它成功了!

    【讨论】:

    • 你是使用 env.Program() 还是使用 Program()?初始化 msvc 工具时需要设置 TARGET_ARCH。请不要修改 SCONS 来源并建议其他人也这样做。有一个 IRC 频道、用户邮件列表和项目监控成员的 stackoverflow。
    • @bdbaddog OP 的愿望是编译所需的工具(Mixxx),他几乎不想知道 scons 是什么以及如何处理它。我的问题几乎相同,我尝试编译 NSIS。这就是安装scons的原因。我不能说我使用的是 env.Program() 还是 Program(),因为它不是我的来源(但是在 SConscript 文件中有几个 env.Program() 出现。添加 env = Environment(TARGET_ARCH='x86') 之前他们没有帮助。此解决方案确实有效。如果您需要 scons 来做其他事情,只需还原更改即可。
    • 我了解情况。有时从项目中获得对 SCons 使用问题的支持是有问题的。无论如何,破解源代码可能会解决您的问题,但总的来说这不是一个好的解决方案。更好的解决方案是向 SCons 开发人员提供足够的信息,然后他们可以正确修复它和/或为相关项目提供正确的修复。
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2016-05-17
    • 2014-08-15
    相关资源
    最近更新 更多