2013-06-05 2 views
11

मैं गो भाषा के लिए कुछ सी बाइंडिंग लिखने का प्रयास कर रहा हूं, और विंडोज़ में कागो संकलन स्थापित करते समय चिपचिपा स्थिति में भाग गया हूं। सीधे मेरी सी मेंक्या एक सीजीए CFLAGS टिप्पणी में पर्यावरण चर का उपयोग करना संभव है?

// #cgo windows CFLAGS: -I C:/dev/extlibs/include/ 
// #cgo windows LDFLAGS: -lMyLib -L C:/dev/extlibs/lib/ 
// #include <mylib/mylib.h> 
import "C" 

जो है मुझे DLLs स्थापित करने से बचने के लिए अनुमति देता है, libs और हेडर फाइल्स:: मैं कोड है कि ऐसा दिखाई देता है \ Windows निर्देशिका, लेकिन बहुत लचीलेपन के लिए अनुमति नहीं है जब अन्य डेवलपर्स एक अलग फ़ाइल सिस्टम सेटअप के साथ काम कर रहे हैं (उन्हें सभी को lib:/dev/extlibs/... में libs की आवश्यकता है)।

क्या कोई तरीका है कि मैं कोड के भीतर से पर्यावरण चर को रेफर कर सकता हूं? शायद कुछ के साथ कुछ:

// #cgo windows CFLAGS: -I $EXTLIBS$/include/ 

या क्या कोई और तरीका है कि लोग इस मुद्दे को हल करते हैं जिसे मैंने याद किया है? मैंने इस विषय पर घूमने में कुछ समय बिताया है और बहुत कुछ नहीं देखा है जो उपयोगी रहा है, इसलिए कोई भी जानकारी और/या संसाधन वास्तविक मदद हो सकते हैं!

उत्तर

7

आप वातावरण चर का उपयोग कर की कोशिश कर सकते, Gentoo Linux Wiki page on Safe C Flags निम्न स्वरूप में एक उदाहरण है

CXXFLAGS="${CFLAGS}" 

तो तुम जैसे

// #cgo windows CFLAGS: -I "${EXTLIBS}"/include/ 

कुछ करने के लिए सक्षम हो सकता है, लेकिन मेरे वाक्य रचना हो सकता है बंद, और यह मेकफ़ाइल विशिष्ट हो सकता है।

तुम भी सेट कर सकते हैं एक CPATH environment variable जो:

निर्देशिका की एक सूची निर्दिष्ट मैं के साथ निर्दिष्ट करता है, तो के रूप में खोजे जाने के लिए, लेकिन कमांड लाइन पर मैं विकल्पों के साथ दिए गए किसी भी रास्तों के बाद। इस पर्यावरण चर का उपयोग इस बात पर ध्यान दिए बिना किया जाता है कि किस भाषा को प्रीप्रोसेस्ड किया जा रहा है।

-L के लिए बराबर मुझे लगता है, LIBRARY_PATH (CPATH लिंक पर बताया गया है) है।

के लिए एक मंच स्वतंत्र तरीके से इस के आसपास पाने के लिए सिफारिश की रास्ते से http://golang.org/cmd/cgo/ एक तरह अनुसार pkg-config उपयोग करने के लिए है।

// #cgo pkg-config: mylib otherlib 

यह खिड़कियां (http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/) के लिए उपलब्ध है और वहाँ this question (How to install pkg config in windows?)

उसके अलावा में यह स्थापित करने पर कुछ और जानकारी है, गो-कोड की एक उप-निर्देशिका में सभी निर्भरता शब्दों में कहें, संबंधित पथ का उपयोग अपने CFLAGS और LDFLAGS में, और अन्य डेवलपर के साथ संपूर्ण बंडल साझा करें।

+0

ये कुछ अच्छे विचार हैं। मैं उन्हें आज़मा दूंगा। एफडब्ल्यूआईडब्ल्यू, मैं डार्विन/लिनक्स पर पीके-कॉन्फ़िगर का उपयोग करता हूं, लेकिन अतीत में विंडोज़ के लायक होने की तुलना में यह हमेशा थोड़ा और परेशानी लग रहा था। –

+0

@ChrisCovert हाँ, Win8 पर निर्भरताओं को हल करने में मुझे कुछ समय लगा :-(इसे अंत में मिला, हालांकि एसओ प्रश्न से जुड़े प्रश्नों में कुछ अच्छे लिंक हैं। – Intermernet

+0

FWIW, मुझे लगता है कि मैं जा रहा हूँ pkg-config को आज़माएं, और देखें कि क्या यह पिछली बार की तुलना में थोड़ा बेहतर काम करता है। संसाधनों के लिए धन्यवाद! –

13

docs for CGO के अनुसार:

जब निर्माण, CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS और CGO_LDFLAGS वातावरण चर झंडे से इन निर्देशों व्युत्पन्न से जुड़ जाते हैं।पैकेज-विशिष्ट झंडे को निर्देशों का उपयोग करके सेट किया जाना चाहिए, पर्यावरण चर नहीं, ताकि अनमोडिफाइड वातावरण में काम करता है।

इस ज्ञान का उपयोग करके, मुझे सफलतापूर्वक third-party package that wraps a C library बनाने में सफलता मिली है क्योंकि यह इसे सिस्टम पैकेज के रूप में प्रदान करता है। उदाहरण मैं से जुड़ा हुआ:

package sdl 

// #cgo LDFLAGS: -lSDL2 
// #include <SDL2/SDL.h> 
import "C" 

भले ही यह SDL2 के लिए एक प्रणाली पैकेज निर्दिष्ट करता है, और मैं कुछ गैर प्रणाली निर्देशिका में स्थापित SDL2 है, मैं अभी भी इस पैकेज वातावरण चर का उपयोग का निर्माण करने में सक्षम हूँ मैं जैसे कि निम्न में के रूप में उल्लेख किया है,:

export SDL_PATH=/home/mark/where/I/installed/sdl 
CGO_CFLAGS="-I$SDL_PATH/include" CGO_LDFLAGS="-L$SDL_PATH/lib" go build hello.go 
LD_LIBRARY_PATH="$SDL_PATH/lib" ./hello 
बेशक

, इस लिनक्स है, लेकिन आप शायद Windows में एक ही विचारों का प्रयोग कर सकते हैं।

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