Заставить SCons использовать 32-битный компилятор MSVC в 64-битной Windows

Я пытаюсь использовать cl из Visual Studio 2010 для создания 32-разрядной версии Mixxx. Mixxx использует SCons для сборки. На моем компьютере установлена ​​64-разрядная версия Windows 7, на которой установлено слишком много версий 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... ]

Итак, 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».

Я нашел пару подсказок:

На основании этого я добавил

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

в SConstruct. Я не знаю SCons, а скрипты сборки нетривиальны, так что вполне вероятно, что я делаю это неправильно. Тем не менее, SCons по-прежнему всегда использует «новейшую версию, x64».


person default.kramer    schedule 17.07.2014    source источник
comment
Вы уже пытались связаться с сопровождающими проекта Mixxx по поводу этой проблемы? В этом случае они, наверное, лучше всех помогут ...   -  person dirkbaechle    schedule 17.07.2014
comment
Да, я разместил в списке рассылки здесь. Полагаю, мне следовало уже включить эту ссылку.   -  person default.kramer    schedule 17.07.2014
comment
Постарайтесь следовать инструкциям на странице comments.gmane.org/gmane. comp.programming.tools.scons.user /, чтобы включить отладку для процесса инициализации MSVS. Если дополнительные отладочные сообщения ничего вам не говорят, опубликуйте свою проблему и результаты отладки пользователю ML SCons ([email protected]).   -  person dirkbaechle    schedule 18.07.2014
comment
Большое спасибо, этот совет по отладке был именно тем, что мне было нужно!   -  person default.kramer    schedule 18.07.2014


Ответы (3)


The Environment kwargs, который вы опубликовали, работает для меня (Scons 2.3.4):

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

env.Program('src.cpp')

Значение для 64-битной программы должно быть TARGET_ARCH='x86_64' согласно http://scons.1086193.n5.nabble.com/32-and-64-bit-builds-on-MSVC-td25425.html. Другие значения MSVC_VERSION также работают.

person zonksoft    schedule 27.10.2014

Я включил ведение журнала согласно комментарию 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. Сначала переименовываю все каталоги "ВК" старших версий.

  • 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 и т. д.
person default.kramer    schedule 18.07.2014
comment
Лучше использовать переменную TARGET_ARCH при инициализации вашей среды, как показано ниже. То, что вы сделали с помощью простого обходного пути, скорее всего, нарушит эти установки Visual Studio. - person bdbaddog; 22.09.2015
comment
@bdbaddog - Да, этот ответ предлагает обходной путь, который абсолютно нарушит эти установки Visual Studio. Но это проще, чем пытаться исправить многотысячные скрипты сборки, когда вы не знаете scons. - person default.kramer; 22.09.2015
comment
вот почему вам следует обратиться к ресурсам поддержки проекта, если вы застряли ... Мы более чем готовы помочь. Либо здесь, в IRC, либо в списке рассылки Users. - person bdbaddog; 20.07.2018

Я попытался установить TARGET_ARCH с помощью env = Environment (blabla), но это не помогло

Поэтому я поискал «TARGET_ARCH» в каталоге Scons (... \ PythonDir \ scons-3.0.1 \ Scons). В моем случае это было в файле 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, заставив его регенерировать

И это сработало!

person mistika    schedule 19.07.2018
comment
Вы тогда использовали env.Program () или вы использовали Program ()? TARGET_ARCH необходимо установить при инициализации инструмента msvc. ПОЖАЛУЙСТА, НЕ МОДИФИЦИРУЙТЕ ИСТОЧНИКИ SCONS и предлагайте другим сделать это тоже. Есть канал IRC, список рассылки пользователей и stackoverflow, за которыми следят участники проекта. - person bdbaddog; 20.07.2018
comment
@bdbaddog ОП желает получить скомпилированный необходимый инструмент (Mixxx), и он почти не хочет знать, что такое scons и как с ним бороться. Моя проблема была почти такой же, я пытался скомпилировать NSIS. Вот почему установили бра. Я не могу сказать, использовал ли я env.Program () или Program (), потому что это не мои источники (однако есть несколько случаев использования env.Program () в файлах SConscript. Добавление env = Environment (TARGET_ARCH = 'x86') раньше они не помогли. Это решение действительно работает. Если вам нужны scons для чего-то еще, просто отмените изменения. - person mistika; 31.07.2018
comment
Я понимаю ситуацию. Иногда получить поддержку от проектов по вопросам, связанным с использованием SCons, бывает проблематично. Тем не менее, взлом источника может решить вашу проблему, но в целом это не очень хорошее решение. Лучшим решением было бы предоставить разработчикам SCons достаточную информацию, которая затем могла бы исправить это должным образом и / или скормить правильное исправление для рассматриваемого проекта. - person bdbaddog; 02.08.2018