Подтвердить что ты не робот

Вызов cl.exe(компилятор MSVC) в оболочке Cygwin

Я сильно использую Cygwin (с оболочкой PuTTY). Но в оболочке Cygwin Bash довольно сложно вызвать cl.exe (т.е. Инструментальную цепочку компилятора Visual С++). Запуск vcvars*.bat в оболочке Bash не работает. Я попытался перенести переменные среды VС++ в Cygwin, но это не так просто.

Как запустить компилятор VС++ в оболочке Cygwin Bash?

4b9b3361

Ответ 1

Я обычно решаю это, добавляя

call "%VS80COMNTOOLS%vsvars32.bat" >NUL:

в c:/cygwin/cygwin.bat. Обратите внимание, что переменная VS80COMNTOOLS чрезвычайно полезна, поскольку она дает вам надежный способ (hm) для поиска vsvars32.bat.

Другим подходом является то, что позволяет легко переключаться между разными версиями Studio:

function run_with_bat()
{
    batfile=$1; shift
    tmpfile="$TMP/tmp$$.bat"
    echo "@echo off" > $tmpfile
    echo "call \"%$batfile%vsvars32.bat\" >NUL:" >> $tmpfile
    echo "bash -c \"%*\"" >> $tmpfile
    cmd /c `cygpath -m "$tmpfile"` "[email protected]"
    status=$?
    rm -f $tmpfile
    return $status
}

function run_vs9()
{
    run_with_bat VS90COMNTOOLS "[email protected]"
}

function run_vs8()
{
    run_with_bat VS80COMNTOOLS "[email protected]"
}

Теперь вы можете сделать:

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

usage: cl [ option... ] filename... [ /link linkoption... ]
$ run_vs9 cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

Обратите внимание на версию компилятора.

Ответ 2

Я понимаю, что ваша проблема заключается в преобразовании vcvars32.bat в оболочку script.

Один из способов решения проблемы основан на идее, что переменные среды наследуются, когда один процесс запускает другой. Таким образом, вы можете просто запустить vcvars32 под cmd, а затем запустить bash. Это отлично работает на моей машине:

sh-3.2$ cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

Кроме того, запустите набор до и после вызова vcvars32 в cmd, а затем создайте оболочку script, чтобы установить переменные среды.

Ответ 3

Следуя рекомендациям в других ответах, я выполнил разницу между моими результатами bash с переменными MSVC и без них и придумал следующий script, чтобы воспроизвести их для моей установки Microsoft Visual С++ 2010 Экспресс. Я немного переделал его, чтобы поместить все компоненты, зависящие от установки, вверху, так что, надеюсь, это может пригодиться другим.

# These lines will be installation-dependent.
export VSINSTALLDIR='C:\Program Files\Microsoft Visual Studio 10.0\'
export WindowsSdkDir='C:\Program Files\Microsoft SDKs\Windows\v7.0A\'
export FrameworkDir='C:\WINDOWS\Microsoft.NET\Framework\'
export FrameworkVersion=v4.0.30319
export Framework35Version=v3.5

# The following should be largely installation-independent.
export VCINSTALLDIR="$VSINSTALLDIR"'VC\'
export DevEnvDir="$VSINSTALLDIR"'Common7\IDE\'

export FrameworkDIR32="$FrameworkDir"
export FrameworkVersion32="$FrameworkVersion"

export INCLUDE="${VCINSTALLDIR}INCLUDE;${WindowsSdkDir}include;"
export LIB="${VCINSTALLDIR}LIB;${WindowsSdkDir}lib;"
export LIBPATH="${FrameworkDir}${FrameworkVersion};"
export LIBPATH="${LIBPATH}${FrameworkDir}${Framework35Version};"
export LIBPATH="${LIBPATH}${VCINSTALLDIR}LIB;"

c_VSINSTALLDIR=`cygpath -ua "$VSINSTALLDIR\\\\"`
c_WindowsSdkDir=`cygpath -ua "$WindowsSdkDir\\\\"`
c_FrameworkDir=`cygpath -ua "$FrameworkDir\\\\"`

export PATH="${c_WindowsSdkDir}bin:$PATH"
export PATH="${c_WindowsSdkDir}bin/NETFX 4.0 Tools:$PATH"
export PATH="${c_VSINSTALLDIR}VC/VCPackages:$PATH"
export PATH="${c_FrameworkDir}${Framework35Version}:$PATH"
export PATH="${c_FrameworkDir}${FrameworkVersion}:$PATH"
export PATH="${c_VSINSTALLDIR}Common7/Tools:$PATH"
export PATH="${c_VSINSTALLDIR}VC/BIN:$PATH"
export PATH="${c_VSINSTALLDIR}Common7/IDE/:$PATH"

Ответ 4

Я фактически использовал ответ JesperE fooobar.com/questions/221043/... (который позволяет вам переключаться между версиями VS), но нашел способ не создавать временный файл bat. Результат намного проще.

function run_in_vs_env
{
    eval vssetup="\$$1\\vsvars32.bat"
    cmd /Q /C call "$vssetup" "&&" "${@:2}"
}

function run_vs11
{
    run_in_vs_env VS110COMNTOOLS "[email protected]"
}

function run_vs10
{
    run_in_vs_env VS100COMNTOOLS "[email protected]"
}

Я предлагаю добавить эти строки в ваши .bash_functions или что-то подобное и экспортировать эти функции там. Это позволит вам использовать функции в сценариях bash.

export -f run_in_vs_env
export -f run_vs11
export -f run_vs10

Ответ 5

Еще одна альтернатива - открыть vcvars32.bat(или vsvars32.bat, который выполняет реальную работу в последней версии Visual Studio), посмотреть, что он делает, и реплицировать это в соответствующей оболочке script.

Это не особенно сложно - все, что он делает, задает кучу переменных среды.

Ответ 6

Я преобразовал файл vsvars32.bat в файл visual_studio.env. Когда мне нужно использовать среду Visual Studio для командной строки, я просто создаю источник этого файла.

В среде оболочки sh я не могу зарегистрировать путь к Windows (\ и ; с sh), поэтому перед тем, как перевести их с помощью cygpath -au или cygpath -aup commands, я запишу их в свой файл .env и переведю их обратно с помощью cygpath -aw или cygpath -aup commands.

Мой visual_studio.env файл выглядит так:

VS80COMNTOOLS=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/Tools/'); export VS80COMNTOOLS
VSINSTALLDIR=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8'); export VSINSTALLDIR
VCINSTALLDIR=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC'); export VCINSTALLDIR
FrameworkDir=$(cygpath -aw '/cygdrive/c/WINDOWS/Microsoft.NET/Framework'); export FrameworkDir
FrameworkVersion='v2.0.50727'; export FrameworkVersion
FrameworkSDKDir=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8/SDK/v2.0'); export FrameworkSDKDir

echo Setting environment for using Microsoft Visual Studio 2005 x86 tools.

DevEnvDir=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/IDE'); export DevEnvDir

PATH='/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/IDE:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/BIN:/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/Tools:/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/Tools/bin:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/PlatformSDK/bin:/cygdrive/c/Programmi/Microsoft Visual Studio 8/SDK/v2.0/bin:/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v2.0.50727:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/VCPackages':$PATH
INCLUDE=$(cygpath -awp '/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/ATLMFC/INCLUDE:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/INCLUDE:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/PlatformSDK/include:/cygdrive/c/Programmi/Microsoft Visual Studio 8/SDK/v2.0/include'); export INCLUDE
LIB=$(cygpath -awp '/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/ATLMFC/LIB:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/LIB:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/PlatformSDK/lib:/cygdrive/c/Programmi/Microsoft Visual Studio 8/SDK/v2.0/lib'); export LIB
LIBPATH=$(cygpath -awp '/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v2.0.50727:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/ATLMFC/LIB'); export LIBPATH

Надеюсь, это поможет вам.

Ответ 7

Я считаю, что лучше использовать msbuild, и в то же время я могу также использовать g++ в моей среде cygwin. Это более комплексный подход, который гармонично сочетается с существующей разработкой visual studio. Использование самого низкого уровня cl и установка переменных окружения требует проблем и идет против ветра. msbuild может лучше настроить вещи для нас. Кроме того, я могу выполнить пошаговую отладку в среде IDE с полным проектом *.vcxproj.

ls -l ~/bin/msbuild
lrwxrwxrwx 1 johnny Domain Users 102 Sep  4 04:25 /home/johnny/bin/msbuild -> /cygdrive/c/Program Files (x86)/Microsoft Visual Studio/2017/Professional/MSBuild/15.0/Bin/MSBuild.exe

Тогда в вашем ~/.bashrc есть эта функция:

builddebug (){
    [ $# -eq 0 ] && return 1;
    msbuild /m /p:Configuration=Debug /p:Platform=Win32 "$1"
}

Ощущение опыта разработки выглядит как это. По крайней мере, я могу лучше использовать компилятор g++ и Visual Studio 2017. Пусть msbuild сделает свое дело. Не cl.

Ответ 8

Я не мог добавлять комментарии к Diomidis reply:(, поэтому должен был отправить ответ вместо этого. Я согласен с его ответом, но было бы утомительно делать "открыть командную строку", запустить Visual Studio/ vcvars32.bat, а затем запустить Bash. Если вы не беспокоитесь о загромождении среды, лучшей альтернативой является изменение Cygwin.bat и изменение ее, чтобы выглядеть примерно так:

@echo off
D:
chdir D:\cygwin\bin
"%VS71COMNTOOLS%\vsvars32.bat" && bash --login -i

Замените переменную окружения VS71COMNTOOLS на что-то подходящее на вашем компьютере.

Нет необходимости открывать командную строку и запускать Bash вручную. Мне очень нравится это решение:). Я не мог дать кредиты реальному автору этого взлома, поскольку я не мог найти ссылку на его статью, извините за это!

Ответ 9

Для меня работало следующее в .bash_profile:

"`cygpath -ua "$VS80COMNTOOLS/vsvars32.bat"`" > NUL

Ответ 10

Одна утилита, которую я нашел довольно бесценной для компиляции файлов с помощью msvc из среды cygwin, - это оболочка, которую я нашел в Coin 3D, библиотечном хранилище "wrapmsvc", двоичный код которого можно найти здесь.

Программа переносит cl.exe и преобразует любые аргументы GCC, указанные в соответствующий аргумент cl.exe. Он также использует API cygwin для правильного перевода пути файла из формы cygwin (/cygdrive/c/temp/test.c) в его фактический путь к файлу (C:\temp\test.c).

Источник взял меня немного, чтобы найти последний раз, но он называется "wrapmsvc.cpp", поэтому, если вам нужно его скомпилировать, найдите этот файл. Если вам удалось скомпилировать его, и вы получите некоторые предупреждения/ошибки амортизации об использовании cygwin_conv_to_posix_path или cygwin_conv_to_win32_path, внесите следующие изменения:

Измените строку:

(void)cygwin_conv_to_posix_path(s.c_str(), buf);

к

(void)cygwin_conv_path(CCP_WIN_A_TO_POSIX, (const void *)s.c_str(), (void *)buf, (size_t)MAX_PATH);

и измените:

(void)cygwin_conv_to_win32_path(s.c_str(), buf);

к

(void)cygwin_conv_path(CCP_POSIX_TO_WIN_A, (const void *)s.c_str(), (void *)buf, (size_t)MAX_PATH);

Ответ 11

Ни один из других ответов не сработал для меня, но это сработало:

  1. Запустите "Командная строка компоновки MS"

enter image description here

  1. сбросить env-переменные: set > c:\temp\cl.env

  2. Откройте командную строку cygwin и создайте скрипт source:

awk < /cygdrive/c/temp/cl.env -F= '{ if($1 !~ ")") print "export " $1 "=\x27" $2 "\x27" }' > cl.source
  1. Теперь, когда вам нужна среда cl, из командной строки cygwin выполните: source cl.source

  2. При желании, источник cl.source в вашем файле .bashrc будет запускаться автоматически при входе в систему.