सॉफ्टवेयर डेवलपर लिनक्स से ओएस एक्स पर स्विच कर रहा है, गोच क्या हैं?


50

मैंने Ubuntu / Fedora / Red Hat / Suse का उपयोग किया है लेकिन OS X का उपयोग बिल्कुल नहीं किया है। अगर मुझे नियमित रूप से ओएस एक्स का उपयोग करना शुरू करना है, तो मुझे किन चीजों पर ध्यान देना चाहिए?

मेरे द्वारा उपयोग किए जाने वाले उपकरण GNU टूल चेन, C ++ / Boost, आदि हैं।


क्या आप अधिक पारंपरिक यूनिक्स / लिनक्स ऐप या मैक ओएसएक्स ऐप विकसित करने जा रहे हैं?
डेविड थॉर्नले

1
कम से कम पहले अधिक परंपरागत यूनिक्स / लिनक्स एप्स में, मैं बस वर्कस्टेशन के रूप में ओएस एक्स पीसी का उपयोग करता हूं।
ग्रुकस

जवाबों:


52

मैंने वर्षों पहले वही चाल चली थी। यहां वे चीजें हैं जो मैं चला रहा हूं:

  • आपके औसत डेस्कटॉप लिनक्स में OS X की तुलना में अधिक समृद्ध उपयोगकर्ता है।

    आप शायद मेरे द्वारा किए गए अलग-अलग टूल को याद करेंगे, इसलिए प्रतिस्थापन के लिए सिफारिशों के बारे में कोई विशेष जानकारी नहीं है।

    इसके बजाय, बस पहली बात Fink , MacPorts , या Homebrew स्थापित करें । ये सिस्टम लिनक्स या बीएसडी के लिए विशिष्ट पैकेज प्रबंधन प्रणाली प्रदान करते हैं। प्रत्येक का अपना स्वाद और पैकेज सेट है, इसलिए सही विकल्प आपके स्वाद और जरूरतों पर आधारित होगा।

    आप पा सकते हैं कि किसी भी पैकेज सिस्टम में आपके लिए आवश्यक हर प्रोग्राम नहीं होगा। कुछ कार्यक्रमों को अभी तक ओएस एक्स में पोर्ट नहीं किया गया है, इसलिए वे किसी भी पैकेज सिस्टम में दिखाई नहीं देंगे । फिर भी, ये प्रणालियां ओएस एक्स के साथ किन जहाजों का विस्तार करती हैं, और लिनक्स से आपके संक्रमण को कम कर देंगी।

  • OS X कमांड लाइन कंपाइलर अब डिफ़ॉल्ट रूप से 64-बिट निष्पादन योग्य बनाता है।

    तेंदुए और इससे पहले, संकलक ने डिफ़ॉल्ट रूप से इसके बजाय 32-बिट निष्पादन योग्य बनाया। यह कई मायनों में समस्या पैदा कर सकता है: हो सकता है कि आपके पास पुरानी 32-बिट लाइब्रेरी हों जिन्हें आप पुनर्निर्माण नहीं कर सकते, लेकिन लिंक करना होगा, हो सकता है कि आप अभी भी 32-बिट मोड में अपना सिस्टम चला रहे हों, आदि।

    32-बिट बिल्ड को बाध्य करने का एक तरीका gccबिल्ड सिस्टम में चूक को ओवरराइड करना है gcc-4.0, जो कि पुराने 32-बिट्स-बाय डिफ़ॉल्ट तेंदुए कंपाइलर हैं। ( स्नो लेपर्ड पर gcc64-बिट-बाय-डिफॉल्ट के लिए एक सिमलिंक है gcc-4.2।) ऑटोकैनफ आधारित बिल्ड सिस्टम के साथ, यह काम करता है:

    $ ./configure CC=gcc-4.0 CXX=g++-4.0
    

    ( CXXयदि प्रोग्राम में C ++ घटक हैं तो आपको केवल इसकी आवश्यकता होगी ।)

    एक और तरीका -m32संकलक और लिंकर को पास करना है:

    $ ./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32
    

    यह अधिक टाइपिंग है, लेकिन यह आपको नए जीसीसी से 32-बिट बनाता है।

  • डायनेमिक लिंकेज काफी अलग है।

    यदि आप अपनी ldआज्ञाओं को हाथ से लिखने के लिए तैयार हैं , तो उस आदत को तोड़ने का समय आ गया है। इसके बजाय आपको संकलक के माध्यम से कार्यक्रमों और पुस्तकालयों को जोड़ना चाहिए, या जैसे मध्यस्थ का उपयोग करना चाहिए libtool। ये निगली प्लेटफ़ॉर्म-विशिष्ट लिंक स्कीम के अंतरों का ध्यान रखते हैं, इसलिए आप उन पोर्टेबल प्रोग्रामों को सीखने के लिए मस्तिष्क की शक्ति बचा सकते हैं जिन्हें आप अलग-अलग नहीं कर सकते हैं।

    उदाहरण के लिए, यदि आप अपने मांसपेशी स्मृति अद्यतन करने के लिए ताकि आप टाइप की आवश्यकता होगी otool -L someprogramबजाय ldd someprogramक्या पुस्तकालयों यह पता लगाने की someprogramसे जुड़ा हुआ है।

    डायनेमिक लिंकेज में एक और अंतर जो आपके दिमाग को सबसे पहले मोड़ देगा वह यह है कि ओएस एक्स पर, लाइब्रेरी के लिए इंस्टॉलेशन लोकेशन लाइब्रेरी में ही रिकॉर्ड की जाती है , और लिंकर कॉपी करता है जो कि लिंक टाइम में एक्जीक्यूटेबल में होता है। इसका मतलब है कि यदि आप किसी ऐसी लाइब्रेरी से जुड़ते हैं जो स्थापित हो गई है, /usr/local/libलेकिन आप इसे अपने उपयोगकर्ताओं को निष्पादन योग्य के रूप में उसी निर्देशिका में शिप करना चाहते हैं, तो आपको अपनी इंस्टॉल प्रक्रिया के भाग के रूप में ऐसा कुछ कहने की आवश्यकता है:

    $ cp /usr/local/lib/libfoo.dylib .
    $ install_name_tool -id @loader_path/libfoo.dylib libfoo.dylib
    $ make LDFLAGS=-L. relink
    

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

    install_name_toolयहाँ मुख्य आदेश है। यदि आप ../libनिष्पादन योग्य के सापेक्ष किसी निर्देशिका में लाइब्रेरी स्थापित करना चाहते हैं, तो इसके बजाय -idतर्क की आवश्यकता होगी @loader_path/../lib/libfoo.dylib

    जो डी पोल ने इस पर एक अच्छा लेख लिखा , जिसमें बहुत अधिक विवरण है।

  • डायनेमिक लिंकेज + थर्ड पार्टी पैकेज जल्दी सिरदर्द पैदा कर सकते हैं।

    जैसे ही आप तृतीय-पक्ष पैकेजों से पुस्तकालयों का उपयोग करने की कोशिश करना शुरू करते हैं, आप पुस्तकालयों को मानक स्थानों में स्थापित नहीं करने की कोशिश करते हैं, जैसे ही आप डायनेमिक लिंकेज के मुद्दों में भाग लेंगे। MacPorts ऐसा करता है, उदाहरण के लिए, पुस्तकालयों को स्थापित करने के /opt/local/libबजाय /usr/libया /usr/local/lib। जब आप इसमें भाग लेते हैं, तो समस्या के लिए एक अच्छा निर्धारण आपके लिए निम्नलिखित की तरह लाइनें जोड़ना है .bash_profile:

    # Tell the dynamic linker (dyld) where to find MacPorts package libs
    export DYLD_LIBRARY_PATH=/opt/local/lib:$DYLD_LIBRARY_PATH
    
    # Add MacPorts header file install dirs to your gcc and g++ include paths
    export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH
    export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
    
  • OS X, CPU संगतता समस्या को लिनक्स से अलग तरीके से संभालता है।

    64-बिट लिनक्स पर जहां आपको किसी भी कारण से 32-बिट का समर्थन करना पड़ता है, आप पुस्तकालयों जैसी चीजों की दो प्रतियों के साथ समाप्त होते हैं, जो दोनों प्रारूपों में होने की आवश्यकता होती है, एक lib64निर्देशिका के समानांतर एक निर्देशिका में 64-बिट संस्करण बंद होते हैं। पारंपरिक libनिर्देशिका।

    यूनिवर्सल बाइनरी कॉन्सेप्ट के साथ OS X इस समस्या को अलग ढंग से हल करता है, जो आपको एक ही फाइल में कई बायनेरिज़ डालने की सुविधा देता है। वर्तमान में आपके पास 4 सीपीयू प्रकार: 32- और 64-बिट पावरपीसी, प्लस 32- और 64-बिट इंटेल का समर्थन करने वाले निष्पादन योग्य हो सकते हैं।

    यूनिवर्सल बायनेरिज़ को Xcode के साथ बनाना आसान है, लेकिन कमांड लाइन टूल के साथ थोड़ा दर्द है। यह आपको ऑटोकैफ़-आधारित बिल्ड सिस्टम के साथ एक यूनिवर्सल इंटेल-बिल्ड बनाता है:

    $ ./configure --disable-dependency-tracking CFLAGS='-arch i386 -arch x86_64' \
      LDFLAGS='-arch i386 -arch x86_64'
    

    जोड़े -arch ppc -arch ppc64को CFLAGSऔर LDFLAGSआप PowerPC समर्थन की आवश्यकता है।

    यदि आप निर्भरता ट्रैकिंग को अक्षम नहीं करते हैं, तो आप केवल एक प्लेटफ़ॉर्म के लिए निर्माण करते हैं, क्योंकि .oपहले प्लेटफ़ॉर्म के लिए नव-निर्मित फ़ाइलों की उपस्थिति make(1)यह आश्वस्त करती है कि इसे दूसरे प्लेटफ़ॉर्म के लिए भी बनाने की आवश्यकता नहीं है। उपरोक्त उदाहरण में दो बार सब कुछ बनाया जाना है; पूरी तरह से सार्वभौमिक बाइनरी के लिए चार बार, अगर आपको अभी भी पावरपीसी समर्थन की आवश्यकता है।

    ( Apple तकनीकी नोट TN2137 में अधिक जानकारी ।)

  • डेवलपर उपकरण डिफ़ॉल्ट रूप से OS X पर स्थापित नहीं हैं।

    लायन से पहले, आपके सिस्टम के लिए सही देव उपकरण प्राप्त करने के लिए सबसे विश्वसनीय जगह ओएस डिस्क पर थी। वे एक वैकल्पिक स्थापित कर रहे हैं।

    ओएस डिस्क से देव टूल्स को स्थापित करने के बारे में अच्छी बात यह है कि आपको पता है कि उपकरण ओएस के साथ काम करेंगे। Apple Apple होने के नाते, आपके पास नवीनतम संकलक को चलाने के लिए OS का एक हालिया संस्करण होना चाहिए, और उन्होंने हमेशा पुराने टूल के डाउनलोड उपलब्ध नहीं कराए हैं, इसलिए OS डिस्क अक्सर किसी दिए गए सही उपकरण को खोजने का सबसे आसान तरीका है देव या परीक्षण बॉक्स।

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

    मेरा सुझाव है कि आप अपने द्वारा डाउनलोड किए गए किसी भी Xcode DMG के कम से कम कुछ संस्करण रखें। जब लायन का उत्तराधिकारी एक या तीन साल के लिए बाहर आता है, तो हो सकता है कि आप लायन टेस्ट वीएम पर एक्सकोड के समकालीन संस्करण को स्थापित करने के तरीके के बिना खुद को पा सकें। ओएस मीडिया की उपलब्धता की समस्या और कमी के मामले में आगे की योजना बनाएं, पुराने संस्करणों को Xcode अन्यथा अप्राप्य बना दें।


2
+1: विशेष रूप से डायनेमिक लिंकेज का उल्लेख करने के लिए। मुझे यह सोचकर पकड़ लिया कि यह बहुत समान होगा। dyldInstall_name की खुशी और कैसे OSX डायनेमिक लिंक एडिटर, डिपेंडेंसी को हल करता है!
Troubadour

MacOS के पुराने संस्करणों को रखने के बारे में: यदि मैं बैकवर्ड संगतता का परीक्षण करना चाहता हूं तो मैं किसी दिए गए OS X संस्करण के साथ अलग-अलग VMs रखने के लिए समानांतर का उपयोग करता हूं। मैं यह या ऐप परीक्षण के लिए एक समान उपकरण की सलाह देता हूं।
13

डेवलपर टूल के पुराने संस्करणों के लिए, check.apple.com देखें । मैंने अभी जाँच की है, और डेवलपर टूल सेक्शन में सूचीबद्ध पहला डाउनलोड OS X 10.3+ के लिए 27 अक्टूबर 2004 से Xcode 1.0 है। कोई ProjectBuilder, लेकिन मैक परियोजनाओं के लिए SOP केवल वर्तमान और पिछले प्रमुख रिलीज़ का समर्थन करना है, इसलिए 10.3+ पर्याप्त से अधिक है।
जेरेमी डब्ल्यू। शेरमैन

@ जेरेमी: अपडेट किया गया। मैं लोगों को आश्वस्त नहीं करना चाहता कि वे हमेशा डाउनलोड करने योग्य होंगे, क्योंकि वे हमेशा अतीत में नहीं रहे हैं।
वॉरेन यंग

29

विशाल गोटा - मैक ओएस फाइलसिस्टम संवेदनशील नहीं है।


9
बस स्पष्ट होने के लिए, वे केस-संरक्षण कर रहे हैं और डिफ़ॉल्ट रूप से केस-संवेदी नहीं हैं। तो आपके फ़ाइल नाम का मामला संरक्षित किया जाएगा, लेकिन आप इसे किसी भी प्रकार के केस के माध्यम से एक्सेस कर सकते हैं। जब फ़ाइल सिस्टम बनाया जाता है तो इसे केस-संवेदी में बदला जा सकता है।
कीथबी

9
@KeithB: हालाँकि, कई मुख्यधारा के मैक ऐप केस-संवेदी फाइलसिस्टम पर नहीं चलेंगे, उदाहरण के लिए Adobe CS स्थापित करने से भी मना करता है, और World of Warcraft नहीं चलेगा। मैं इस से जल गया और ठीक होने का एकमात्र तरीका एक सुधारित डिस्क पर अपने सिस्टम को बैकअप और रीस्टोर करना था।
मई को

1
वर्जन कंट्रोल से निपटने और मल्टीप्लायर टीम में किसी प्रोजेक्ट पर काम करने के दौरान यह ज्यादातर एक गेटा है।
अरफांगियन

मैंने इसे हल करने के लिए एक केस-संवेदी स्पार्सबंडल बनाया। शुक्र है, मेरा इस SSD पर अप्रयुक्त विभाजन है।
dhchdhd

9

हालाँकि Fink और MacPorts OS X पर यूनिक्स पैकेज पाने के पारंपरिक साधन हैं, लेकिन मैं एक नए टूल की जाँच करने की सलाह brewदूंगा, जो मेरे लिए बेहतर काम करे और मेरे सिस्टम के साथ कम गड़बड़ करे, और इसका उपयोग करना बहुत आसान है। यह मूल रूप से केवल टैरबॉल डाउनलोड करता है और / usr / लोकल पर इंस्टॉल होता है, लेकिन यह पूरी प्रक्रिया को बहुत अच्छी तरह से स्वचालित करता है।

http://mxcl.github.com/homebrew/


1
माना; होमब्रेव मैकपॉर्ट्स की तुलना में मेरे लिए बहुत स्मूथ काम कर रहा है।
जोनीक

4

विशाल गोटा - मैक ओएस फाइलसिस्टम संवेदनशील नहीं है।

आप मैक ओएस एक्स पर एक केस संवेदनशील डिस्क छवि बना सकते हैं जिसे सामान्य हार्ड ड्राइव वॉल्यूम के रूप में माउंट किया जा सकता है।

# cf. http://codesnippets.joyent.com/posts/show/8617
IMAGE="${HOME}/Desktop/Case Sensitive Test.dmg"
VOLNAME="Case Sensitive Test"

hdiutil create "${IMAGE}" -size 10m -fs HFSX -volname "${VOLNAME}" -layout NONE

hdiutil attach "${IMAGE}"

cd "/Volumes/${VOLNAME}"
touch foo.txt Foo.txt
open .
ls -l [Ff]oo.txt
stat -f "inode: %i  --  name: %N" [Ff]oo.txt

cd ~
hdiutil detach "/Volumes/${VOLNAME}"

3

यहाँ चयनित देव लेखों का एक अच्छा स्रोत है, कोको साहित्य सूची:

http://osx.hyperjeff.net/Reference/CocoaArticles

(यह विशेष रूप से उपयोगी हो सकता है यदि एक दिन आप मैक ओएस एक्स विशिष्ट उपहारों का उपयोग करना चाहते हैं।)


3

जब Solaris, BSD, Linux, और Windows से OSX के लिए एक नेटवर्क स्टैक को पोर्ट करना मुख्य बिंदु है जो ध्यान आकर्षित करता है कि FreeBSD की तरह पूरी टूल चेन बहुत पुरानी है।

Apple OSX शेर के साथ गति कर रहा है लेकिन तेंदुआ, हिम तेंदुआ आधुनिक लिनक्स वितरण के पीछे बहुत सुंदर है और कई मानकों का समर्थन नहीं किया जाता है। मेरे मामले में मैं RFC 3678 (मल्टीकास्ट सोर्स फिल्टर्स के लिए सॉकेट इंटरफेस एक्सटेंशन्स) की कमी से जूझ रहा हूं ।

OSX सर्वर पर मैंने केस-संवेदी फ़ाइल सिस्टम स्थापित किया है क्योंकि यह HTTP सेवारत के लिए ऐसा करने की सिफारिश करता है।

  • पुराना जी.सी.सी.
  • ओल्ड ऑटोकोनफ, ऑटोमेटेक, लिबटूल
  • कोई Preadread spinlocks, OSX देशी विकल्प प्रदान करता है।
  • नहीं कई पुन: किराएदार एनएसएस एपीआई।
  • अत्यधिक उपयोगी /procफ़ाइल सिस्टम नहीं।
  • नहीं /dev/rtc, /dev/hpetऔर RDTSCलगता है कि दम तोड़ दिया। OSX देशी विकल्प प्रदान करता है।
  • नहीं epoll, लेकिन आपके पास pollऔर kqueue है

1

OS X समर्थन करता है pthread_cond_timedwaitलेकिन यह पूर्ण कैलेंडर समय का उपयोग करता है और एक नीरस रूप से बढ़ते समय का उपयोग करने का कोई तरीका नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.