2008-12-14 7 views
23

में cl.exe (एमएसवीसी कंपाइलर) का आह्वान करना मैं साइगविन का उपयोग कर रहा हूं (PuTTY खोल के साथ)। लेकिन, सिग्विन बैश खोल में cl.exe (यानी, दृश्य सी ++ कंपाइलर टूलचेन) का आह्वान करना काफी मुश्किल है। बैश खोल में vcvars*.bat चलाना स्पष्ट रूप से काम नहीं करता है। मैंने वीसी ++ के पर्यावरण चर को साइगविन में माइग्रेट करने का प्रयास किया, लेकिन यह इतना आसान नहीं है।सिग्विन खोल

मैं सिगविन के बैश खोल में वीसी ++ कंपाइलर कैसे चला सकता हूं?

+0

इस सवाल से संबंधित है http://stackoverflow.com/questions/62029/vs2008-command-prompt-cygwin/168447#168447 – Ted

+0

मेरे wrapmsvc [http://code.google.com/p/ wrapmsvc] कार्यक्रम सहायक हो सकता है। यह क्लिंग कॉल करने के लिए एक रैपर है।लिनक्स से शराब के माध्यम से exe और अन्य एमएस उपकरण; यह यूनिक्स-स्टाइल पथों को वाइन के विंडोज-स्टाइल पथों में अनुवाद करता है और शराब के माध्यम से वास्तविक उपकरण शुरू करता है। इसका मतलब है कि आप वास्तविक कंपाइलर को भ्रमित किए बिना यूनिक्स पथ के साथ कंपाइलर को कॉल कर सकते हैं। बेशक यह सिग्विन में काम नहीं करेगा क्योंकि वहां कोई शराब नहीं है, लेकिन आप शराब का उपयोग न करने के लिए इसे संशोधित करने में सक्षम हो सकते हैं और पथ पथ को किसी अन्य तरीके से कर सकते हैं। –

उत्तर

10

मैं समझता हूं कि आपकी समस्या vcvars32.bat को एक शेल स्क्रिप्ट में परिवर्तित कर रही है।

समस्या के चारों ओर एक तरीका इस विचार पर आधारित है कि एक प्रक्रिया एक और लॉन्च होने पर पर्यावरण चर विरासत में प्राप्त होती है। तो आप cmd के तहत vcvars32 चला सकते हैं और फिर बैश चला सकते हैं। यह मेरा मशीन पर ठीक काम करता है:

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

वैकल्पिक रूप से, पहले सेट चलाने के लिए और cmd तहत vcvars32 लागू करें, और उसके बाद वातावरण चर सेट करने के लिए एक खोल स्क्रिप्ट पैदा करते हैं।

+1

यदि आप हमेशा साइगविन पर एमएससी के एक विशिष्ट संस्करण का उपयोग नहीं करना चाहते हैं या हर बार इसका उपयोग नहीं करना चाहते हैं तो यह सरल विकल्प सबसे अच्छा है। –

1

एक और विकल्प vcvars32.bat (या vsvars32.bat, जो विजुअल स्टूडियो के हाल के संस्करण में असली काम करता है) खोलने के लिए है, यह देखें कि यह क्या करता है, और उचित शेल स्क्रिप्ट में इसे दोहराना है।

यह विशेष रूप से जटिल नहीं है - यह सब पर्यावरण चर का एक गुच्छा सेट करता है।

2

मैंने अपनी फ़ाइल को मेरी visual_studio.env फ़ाइल के साथ परिवर्तित कर दिया है। जब मुझे कमांड लाइन विजुअल स्टूडियो के पर्यावरण का उपयोग करने की आवश्यकता होती है, तो मैं बस इस फ़ाइल का स्रोत करता हूं।

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 

मुझे आशा है कि यह आप कर सकते हैं। /cygwin/cygwin.bat:

25

मैं आमतौर पर

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

जोड़ने ग द्वारा इस का समाधान। ध्यान दें कि VS80COMNTOOLS चर अत्यंत उपयोगी है, क्योंकि यह आपको vsvars32.bat को ढूंढने का मूर्खतापूर्ण (एचएम) तरीका देता है।

एक और दृष्टिकोण इस जिसे आप आसानी से विभिन्न स्टूडियो संस्करण के बीच स्विच करने की अनुमति देता है,:

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

नोट संकलक संस्करण।

+0

विजुअल स्टूडियो 2008 के लिए - कॉल करें "% VS90COMNTOOLS% vsvars32.bat" –

+0

मुझे इस "गूंज कॉल" को "echo" कॉल \ "% $ batfile% में संशोधित करना होगा .. \\ .. \\ वीसी \\ vcvarsall.bat \ "amd64> NUL:" >> $ tmpfile' x64 कोड बनाने के लिए सही कंपाइलर संस्करण लेने के लिए। – DigitalEye

+0

मैंने run_with_bat फ़ंक्शन को केवल पहली पंक्ति में बदल दिया और यह: 'cmd/c call" $ {! Batfile} vsvars32.bat "\ & \ & bash -c" $ * "जो मेरे लिए ठीक नहीं है फाइलों की जरूरत है। मूल संस्करण मुझे "प्रोग्राम फ़ाइलें (x86)" में रिक्त स्थान के साथ परेशानी दे रहा था। – contero

0

मैं Diomidis's reply :(करने के लिए टिप्पणी नहीं जोड़ सकता है, इसलिए बजाय एक जवाब पोस्ट करने के लिए किया था। मैं उसका जवाब से सहमत है, लेकिन यह, ऐसा करने के लिए "एक कमांड प्रॉम्प्ट खोलें" थकाऊ चलाने होगा दृश्य स्टूडियो/vcvars32.bat और फिर बैश चलाएं।

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

स्थानापन्न आपकी मशीन पर उचित कुछ के साथ वातावरण चर VS71COMNTOOLS: क्या आप पर्यावरण को अव्यवस्थित के बारे में परेशान नहीं करते हैं, सबसे अच्छा विकल्प Cygwin.bat को संशोधित करने और कुछ इस तरह देखने के लिए इसे संशोधित करने के लिए है।

कमांड प्रॉम्प्ट खोलने और मैन्युअल रूप से बैश चलाने की आवश्यकता नहीं है। मुझे यह समाधान बहुत पसंद है :)। मैं इस हैक के असली लेखक को क्रेडिट नहीं दे सका, क्योंकि मुझे उसके लेख पर एक लिंक नहीं मिला, इसके बारे में खेद है!

0

मेरे लिए, .bash_profile में निम्नलिखित काम किया:

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

+2

यह मेरे लिए काम नहीं किया। यद्यपि यह ठीक चल रहा है, लेकिन यह सेट किए जाने वाले पर्यावरण चर को खोल में वापस प्रसारित नहीं लगता है। –

12

के बाद सुझाव अन्य उत्तर में, मैं "सेट" था मेरी पार्टी के एक diff के साथ और MSVC चर के बिना परिणाम है, और आया माइक्रोसॉफ्ट विजुअल सी ++ 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" 
+0

यह दुर्भाग्यपूर्ण है लेकिन यह भी मुझे मिला सबसे अच्छा समाधान है। –

0

एक उपयोगिता मैं एक cygwin वातावरण से MSVC के साथ सामान संकलन के लिए बहुत अमूल्य पाया एक आवरण मैं Coin 3D लायब्रेरी के स्रोत भंडार "wrapmsvc" कहा जाता है, जो बाइनरी है में पाया here पाया जा सकता है है।

प्रोग्राम cl.exe को लपेटता है और उपयुक्त cl.exe तर्क में निर्दिष्ट किसी भी जीसीसी तर्क को परिवर्तित करता है। यह सिग्विन एपीआई का उपयोग साइगविन फॉर्म (/cygdrive/c/temp/test.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); 
6

मैं वास्तव में JesperE जवाब https://stackoverflow.com/a/374411/380247 थे, लेकिन एक तरह से अस्थायी बल्ला फ़ाइल बनाने के लिए नहीं मिला (है कि आप वी.एस. संस्करणों के बीच स्विच करने की अनुमति देता है)। तो परिणाम बहुत आसान है।

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 या कुछ समान जोड़ने और इन कार्यों को निर्यात करने का सुझाव देता हूं। यह आपको अपनी बैश स्क्रिप्ट में फ़ंक्शंस का उपयोग करने की अनुमति देगा।

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

वास्तव में बहुत साफ समाधान! – malat

संबंधित मुद्दे