2008-12-14 13 views
23

Ich benutze Cygwin (mit PuTTY Shell) stark. Aber es ist ziemlich schwierig, cl.exe (das heißt, die Visual C++ - Compiler-Toolchain) in der Cygwin Bash-Shell aufzurufen. Running vcvars*.bat in der Bash-Shell funktioniert offensichtlich nicht. Ich habe versucht, die Umgebungsvariablen von VC++ auf Cygwin zu migrieren, aber das ist nicht so einfach.Aufruf von CL.exe (MSVC-Compiler) in Cygwin Shell

Wie kann ich den VC++ - Compiler in Cygwins Bash-Shell ausführen?

+0

Diese Frage http://stackoverflow.com/questions/62029/vs2008-command-prompt-cygwin/168447#168447 – Ted

+0

Mein wrapmsvc [bezogen http://code.google.com/p/ wrapmsvc] Programm könnte hilfreich sein. Es ist ein Wrapper für den Aufruf von cl.exe und andere MS-Tools von Linux über Wine; Es übersetzt Pfade im Unix-Stil in Weins Windows-Stil-Pfade und startet das echte Tool über Wine. Dies bedeutet, dass Sie den Compiler mit Unix-Pfaden aufrufen können, ohne den echten Compiler zu verwirren. Natürlich wird es in Cygwin nicht funktionieren, weil es dort keinen Wein gibt, aber Sie könnten es vielleicht ändern, um nicht Wein zu verwenden und stattdessen die Pfadübersetzung auf andere Weise zu machen. –

Antwort

10

Ich verstehe, dass Ihr Problem vcvars32.bat in ein Shell-Skript konvertiert.

Ein Weg um das Problem basiert auf der Idee, dass Umgebungsvariablen geerbt werden, wenn ein Prozess einen anderen startet. So können Sie einfach vcvars32 unter cmd ausführen und dann bash ausführen. Dies funktioniert auf meinem Rechner fein:

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

Alternativ bevor gesetzt laufen und nach vcvars32 unter cmd aufrufen und dann ein Shell-Skript erstellen, um die Umgebungsvariablen zu setzen.

+1

Wenn Sie nicht immer eine bestimmte Version von MSC auf cygwin start verwenden möchten oder nicht jedes Mal verwenden möchten, dann ist diese einfache Option die beste. –

1

Eine andere Alternative ist es, vcvars32.bat (oder vsvars32.bat, die die echte Arbeit in der letzten Version von Visual Studio tut) zu öffnen, zu sehen, was es tut, und das im entsprechenden Shell-Skript zu replizieren.

Es ist nicht besonders komplex - es setzt nur eine Reihe von Umgebungsvariablen.

2

Ich habe meine vsvars32.bat Datei mit meiner visual_studio.env Datei konvertiert. Wenn ich die Umgebung von Visual Studio in der Befehlszeile verwenden muss, mache ich nur eine Quelle dieser Datei.

Im sh Shell-Umgebung, kann ich mich registrieren nicht den Windows-Pfad (\ und ; Zusammenstoß mit sh) so , bevor ich sie übersetzen mit cygpath -au oder cygpath -aup commands dann habe ich sie in meine .env Datei aufschreiben und übersetzen sie wieder mit cygpath -aw oder cygpath -aup commands.

Meine visual_studio.env Datei sieht wie folgt aus:

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 

Ich hoffe, das Ihnen helfen kann. /cygwin/cygwin.bat:

25

ich dies in der Regel durch Zugabe von

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

bis c lösen. Beachten Sie, dass die Variable VS80COMNTOOLS äußerst nützlich ist, da sie Ihnen eine harmlose Möglichkeit bietet, vsvars32.bat zu lokalisieren.

Ein anderer Ansatz ist das, was man leicht wechseln zwischen verschiedenen Studio-Versionen erlaubt:

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]" 
} 

Sie jetzt tun können:

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

Hinweis der Compiler-Version.

+0

Für Visual Studio 2008 - Aufruf "% VS90COMNTOOLS% vsvars32.bat" –

+0

Ich musste Ihren "Echo-Aufruf ..." zu diesem Echo-Aufruf "% $ batfile% .. \\ .. \\ VC" ändern \\ vcvarsall.bat \ "amd64> NUL:" >> $ tmpfile ", um die richtige Compiler-Version zum Erstellen von x64-Code auszuwählen. – DigitalEye

+0

Ich änderte die run_with_bat Funktion auf nur die erste Zeile und dies: 'cmd/c Anruf" $ {! Batfile} vsvars32.bat "\ & \ & bash -c" $ * "' Was für mich ohne Temp geht es gut Dateien benötigt. Die ursprüngliche Version gab mir Probleme mit den Leerzeichen in "Programme (x86)". – contero

0

Ich konnte nicht kommentieren zu Diomidis's reply :(, so anstatt eine Antwort zu schreiben hatte. ich mit seiner Antwort einverstanden, aber es wäre langweilig zu tun „um eine Eingabeaufforderung öffnen“, führen Sie Visual Studio/vcvars32.bat und dann lauf Bash.Wenn Sie nicht über Poltern Sie Umgebung nicht die Mühe, die beste Alternative ist Cygwin.bat zu ändern und ändern Sie es so etwas wie folgt aussehen:

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

Ersatz die Umgebungsvariable VS71COMNTOOLS mit etwas angemessen auf Ihrem Rechner.

Es ist nicht notwendig, eine Eingabeaufforderung zu öffnen und Bash manuell auszuführen. Ich mag diese Lösung sehr :). Ich konnte dem wirklichen Autor dieses Hacks keine Credits geben, da ich keinen Link zu seinem Artikel finden konnte, tut mir leid!

0

Für mich folgende in Bash_profile gearbeitet:

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

+2

Es hat nicht für mich funktioniert. Obwohl die Umgebungsvariablen ordnungsgemäß ausgeführt wurden, scheinen sie sich nicht in die Shell zurück zu übertragen. –

12

folgende Vorschläge in den anderen Antworten, ich habe ein diff meiner bash habe „set“ Ergebnisse mit und ohne die MSVC Variablen und kam mit dem folgenden Skript, um sie für meine Installation von Microsoft Visual C++ 2010 Express zu reproduzieren. Ich habe es ein wenig überarbeitet, um alle installationsabhängigen Teile an die Spitze zu setzen, also hoffentlich kann das für andere nützlich sein.

# 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" 
+0

Es ist bedauerlich, aber das ist die beste Lösung, die ich auch gefunden habe. –

0

Ein Dienstprogramm, das ich ziemlich von unschätzbarem Wert gefunden Zeugs mit msvc aus einer Cygwin-Umgebung für die Erstellung ist ein Wrapper ich in der „wrapmsvc“ genannt Coin 3D Bibliothek Quellcode-Repository gefunden, die binär ist here gefunden werden kann.

Das Programm umschließt cl.exe und konvertiert alle GCC-Args, die im entsprechenden cl.exe-Argument angegeben sind. Es verwendet auch cygwin API, um den Dateipfad von Cygwin-Form (/cygdrive/c/temp/test.c) korrekt in den tatsächlichen Dateipfad (C: \ temp \ test.c) zu übersetzen.

Die Quelle brauchte eine Weile, um das letzte Mal zu finden, aber es heißt "wrappsvc.cpp", wenn Sie es kompilieren müssen, suchen Sie nach dieser Datei. Wenn Sie geschehen, es zu kompilieren und einige Abschreibungs Warnungen/Fehler über die Verwendung von cygwin_conv_to_posix_path oder cygwin_conv_to_win32_path erhalten, folgende Änderungen vornehmen:

Ändern Sie die Zeile:

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

zu

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

und Änderung:

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

zu

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

habe ich eigentlich JesperE Antwort https://stackoverflow.com/a/374411/380247 (das können Sie zwischen VS-Versionen wechseln), aber einen Weg gefunden, nicht nur vorübergehend bat-Datei zu erstellen. Das Ergebnis ist viel einfacher.

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]" 
} 

Ich schlage vor, diese Zeilen zu Ihrem .bash_functions oder etwas ähnliches und exportieren diese Funktionen dort hinzuzufügen. Dadurch können Sie Funktionen in Ihren Bash-Skripten verwenden.

export -f run_in_vs_env 
export -f run_vs11 
export -f run_vs10 
+0

sehr saubere Lösung in der Tat! – malat