Yazılım geliştiriciden Linux'tan OS X'e geçme, elde edilenler nelerdir?


50

Ubuntu / Fedora / Red Hat / Suse kullandım ancak OS X'i hiç kullanmadım. Düzenli olarak OS X'i kullanmaya başlamam gerekirse, dikkat etmem gerekenler nelerdir?

Kullandığım araçlar GNU takım zinciri, C ++ / Boost, vb.


Daha geleneksel Unix / Linux uygulamaları mı yoksa Mac OSX uygulamaları mı geliştireceksiniz?
David Thornley

1
En azından ilk önce daha geleneksel Unix / Linux uygulamaları, sadece OS X PC'yi bir iş istasyonu olarak kullanıyorum.
grokus

Yanıtlar:


52

Aynı hareketi yıllar önce yaptım. İşte karşılaştığım şeyler:

  • Ortalama masaüstü Linux’unuz OS X’inkinden daha zengin bir kullanıcı alanına sahiptir.

    Muhtemelen benden farklı araçları özleyeceksin, bu yüzden değişiklik önerileri konusunda kesinleşmenin bir anlamı yok.

    Bunun yerine, ilk önce Fink , MacPorts veya Homebrew'i yükleyin . Bu sistemler Linux veya BSD'lere özgü bir paket yönetim sistemi sağlar. Her birinin kendine özgü lezzeti ve paket seti vardır, bu yüzden doğru seçim zevkinize ve ihtiyaçlarınıza göre olacaktır.

    İhtiyacınız olan her programın tek bir paket sistemde bulunmayacağını görebilirsiniz. Bazı programlar henüz OS X'e taşınmamıştır, bu nedenle herhangi bir paket sisteminde görünmezler . Bununla birlikte, bu sistemler OS X ile gelenleri büyük ölçüde genişletmektedir ve Linux'tan geçişinizi kolaylaştıracaktır.

  • OS X komut satırı derleyicileri artık varsayılan olarak 64 bitlik yürütülebilir dosyalar oluşturuyor.

    Leopard ve önceki sürümlerde, derleyiciler varsayılan olarak 32 bitlik yürütülebilir dosyalar oluşturdular. Bu, çeşitli şekillerde sorunlara neden olabilir: belki yeniden oluşturamayacağınız eski 32-bit kütüphaneleriniz var ancak bunlarla bağlantı kurmalısınız, belki de sisteminizi 32-bit modunda çalıştırıyorsunuz, vb.

    32 bitlik bir derlemeyi zorlamanın bir yolu gcc, derleme sistemlerinde varsayılan olarak gcc-4.0eski 32-bit Leopard derleyicisi olan derlemelerin geçersiz kılınmasıdır . ( Snow Leopard'da gccvarsayılan gcc-4.2olarak 64 bitlik bir bağlantıdır .) Autoconf tabanlı derleme sistemleriyle bu çalışır:

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

    (Yalnızca CXXprogram C ++ bileşenleri içeriyorsa , bit'e ihtiyacınız vardır .)

    -m32Derleyici ve bağlayıcıya geçmenin bir başka yolu :

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

    Daha çok yazıyor, ancak yeni GCC'den 32 bit sürüm almanıza izin veriyor.

  • Dinamik bağlantı çok farklıdır.

    ldElindeki komutları elle yazma sırasın buysa , bu alışkanlığı kırmanın zamanı geldi. Bunun yerine programları ve kitaplıkları derleyici üzerinden bağlamanız veya benzeri bir aracı kullanmanız gerekir libtool. Bunlar, platforma özgü bağlantı şeması farklılıklarına dikkat eder, böylece taşınabilir mekanizmalarla soyutlayamayacağınız öğrenme programları için beyin gücünü koruyabilirsiniz.

    Örneğin, kas hafızanızı güncellemeniz gerekir, böylece hangi kitaplıkların bağlantılı olduğunu bulmak otool -L someprogramyerine yazabilirsiniz .ldd someprogramsomeprogram

    Beyninizi ilk önce bükecek olan dinamik bağlantıdaki diğer bir fark, OS X'te bir kütüphanenin kurulum yerinin kütüphanenin kendisine kaydedilmiş olmasıdır ve linker, bunu link zamanında çalıştırılabilir dosyaya kopyalar. Bunun anlamı, kurulu olan bir kütüphaneye bağlanırsanız /usr/local/libancak onu çalıştırılabilir dosyayla aynı dizinde kullanıcılarınıza göndermek istiyorsanız, kurulum işleminizin bir parçası olarak böyle bir şey söylemeniz gerekir:

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

    Şimdi, yukarıdakilerin çoğunun derleme sisteminize göre değişmesi muhtemeldir, bu nedenle sadece bir tarif yerine örnek olarak alın. Bunun yaptığı, bağlantı kurduğumuz bir kütüphanenin özel bir kopyasını çıkarması, paylaşılan kütüphane tanımlayıcısını mutlak bir yoldan "çalıştırılabilir ile aynı dizinde" anlamına gelen göreceli bir kimliğe dönüştürmesi, daha sonra bu değiştirilmiş kopyaya karşı yürütülebilir dosyayı yeniden oluşturmaya zorlamasıdır. Kütüphanenin

    install_name_toolBurada çekirdek komuttur. Bunun yerine kütüphaneyi ../libyürütülebilir dosyaya göre bir dizine kurmak isteseydiniz, bunun yerine -idargüman olması gerekirdi @loader_path/../lib/libfoo.dylib.

    Joe Di Pol bu konuda çok daha ayrıntılı bir yazı yazdı .

  • Dinamik bağlantı + üçüncü taraf paketleri erken başlarda baş ağrısına neden olabilir.

    Kütüphaneleri standart konumlara yüklemeyen üçüncü taraf paketlerinden kütüphaneleri kullanmaya başlar başlamaz, dinamik bağlantı sorunları yaşamaya başlayabilirsiniz. MacPorts bunu yapar, örneğin kütüphaneleri içine veya /opt/local/libyerine kütüphaneler kurar . Bununla karşılaştığınızda, sorun için iyi bir düzeltme aşağıdaki gibi satırları eklemek içindir :/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 uyumluluğu sorununu Linux'tan farklı şekilde ele alır.

    Her ne sebeple olursa olsun 32-bit'i desteklemeniz gereken 64-bit bir Linux'ta, her iki formatta olması gereken kütüphaneler gibi iki kopyasını, 64-bit sürümleri lib64paralel bir dizinde geleneksel libdizin

    OS X, birden fazla ikili dosyayı tek bir dosyaya koymanıza izin veren Evrensel ikili kavramıyla bu sorunu farklı şekilde çözer. Şu anda en fazla 4 CPU türünü destekleyen çalıştırılabilir dosyalara sahip olabilirsiniz: 32 ve 64 bit PowerPC, artı 32 ve 64 bit Intel.

    Xcode ile Universal ikili dosyaları oluşturmak kolaydır, ancak komut satırı araçları ile biraz acı çektirir. Bu size Autoconf tabanlı derleme sistemleriyle birlikte yalnızca Evrensel bir Intel derlemesi kazandırır:

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

    Ekle -arch ppc -arch ppc64için CFLAGSve LDFLAGSsize PowerPC desteği gerekiyorsa.

    Bağımlılık izlemesini devre dışı bırakmazsanız, yalnızca bir platform için yapı oluşturmaya başlayacaksınız çünkü .oilk platform için yeni oluşturulan dosyaların varlığı make(1), ikinci platform için de oluşturulmasına gerek olmadığına ikna eder. Yukarıdaki örnekte her şeyin iki kez inşa edilmesi gerekiyor; hala PowerPC desteğine ihtiyacınız varsa, tamamen Evrensel bir ikili dosya için dört kez.

    ( Apple Technical Note TN2137'de daha fazla bilgi bulabilirsiniz .)

  • Geliştirici araçları varsayılan olarak OS X'te yüklü değildir.

    Lion'dan önce, sisteminiz için doğru araçları geliştirmek için en güvenilir yer işletim sistemi diskleriydi. İsteğe bağlı bir kurulum.

    Dev aletlerinin işletim sistemi disklerinden yüklenmesiyle ilgili güzel bir şey, aletlerin işletim sistemi ile çalışacağını bilmenizdir. Apple, Apple olmak üzere, en son derleyicileri çalıştırmak için işletim sisteminin yeni bir sürümüne sahip olmak zorundasınız ve her zaman eski araçların indirilmesini sağlamamışlardır, bu yüzden işletim sistemi diskleri genellikle belirli bir araç için doğru araçları bulmak için en kolay yoldur. dev veya test kutusu.

    Lion ile, yükleme medyasını kaldırmaya çalışıyorlar, bu yüzden pahalı USB anahtar sürümünü satın almadıkça Xcode'u App Store'dan indirmeniz gerekecek .

    İndirdiğiniz tüm Xcode DMG'lerin en az birkaç versiyonunu saklamanızı öneririm. Lion'un halefi bir ya da üç yıl sonra çıktığında, kendinizi Lion test VM'sine çağdaş bir Xcode sürümü kurmanın bir yolunu bulamayabilirsiniz. Kullanılabilirlik sorunları ve işletim sistemi ortamının olmaması, Xcode'un eski sürümlerini yoksa elde edilemez hale getirmesi durumunda önceden planlayın.


2
+1: özellikle dinamik bağlantıdan bahsetmek için. Çok benzer olacağını düşünerek yakalandım. dyldİnstall_name ve OSX dinamik bağlantı düzenleyicisinin sevinci, bağımlılıkları giderir!
Troubadour

MacOS'un eski sürümlerini tutma hakkında: Geriye dönük uyumluluğu test etmek istersem, ayrılmış VM'leri belirli bir OS X sürümüyle tutmak için Parallel'ı kullanıyorum. Bunu veya uygulama testi için benzer bir aracı öneriyorum.
ogerard

Geliştirici araçlarının eski sürümleri için connect.apple.com adresini ziyaret edin . Yeni kontrol ettim ve Geliştirici Araçları bölümünde listelenen ilk indirme işlemi OS X 10.3+ için 27 Ekim 2004 tarihli Xcode 1.0. ProjectBuilder yok, ancak Mac projeleri için SOP yalnızca mevcut ve önceki ana sürümleri desteklemektir, bu nedenle 10.3+ fazlasıyla yeterli.
Jeremy W. Sherman,

@ Jeremy: Güncelleme. Her zaman geçmişte olmadıklarından, insanların her zaman indirilebilir olduklarını garanti etmek istemiyorum.
Warren Young,

29

BÜYÜK GOTCHA - Mac OS dosya sistemi büyük / küçük harfe duyarlı değildir.


9
Sadece açık olmak gerekirse, büyük / küçük harf koruyucu ve varsayılan olarak büyük / küçük harf duyarlı değildir. Böylece dosya adınızın durumu korunacaktır, ancak herhangi bir çeşitlemeyle ona erişebilirsiniz. Bu, dosya sistemi oluşturulduğunda büyük / küçük harf duyarlı olarak değiştirilebilir.
KeithB

9
@KeithB: Ancak, çoğu ana Mac uygulaması büyük / küçük harf duyarlı bir dosya sisteminde çalışmaz, örneğin Adobe CS bile yüklemeyi reddeder ve World of Warcraft çalışmaz. Bu tarafından yakıldım ve kurtarmanın tek yolu sistemimi yeniden biçimlendirilmiş bir diske geri yüklemek ve geri yüklemek oldu.
Neil Mayhew

1
Bu çoğunlukla sürüm kontrolü ile uğraşırken ve çok platformlu bir ekipte bir proje üzerinde çalışırken ortaya çıkmıştır.
Arafangion

Bunu çözmek için büyük / küçük harf duyarlı bir sparebundle oluşturdum. Neyse ki, bu SSD'de kullanılmayan bir bölümüm var.
dhchdhd

9

Her ne kadar Fink ve MacPorts, OS X'te unix paketlerini elde etmenin geleneksel yolu olsa da, benim brewiçin daha iyi çalışan ve sistemimle daha az karışık olan ve kullanımı daha kolay olan yeni bir araç bulmanızı tavsiye ederim . Temel olarak sadece tarball'ları indirir ve / usr / local dizinine kurulur, ancak tüm süreci çok güzel bir şekilde otomatikleştirir.

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


1
Kabul; Homebrew benim için MacPorts'tan daha düzgün çalışıyor.
Jonik

4

BÜYÜK GOTCHA - Mac OS dosya sistemi büyük / küçük harfe duyarlı değildir.

Mac OS X'te normal bir sabit sürücü birimi olarak takılabilen büyük / küçük harf duyarlı bir disk görüntüsü oluşturabilirsiniz.

# 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

Solaris, BSD, Linux ve Windows’tan bir ağ yığınını OSX’e aktarırken, dikkat çeken tek ana nokta FreeBSD’ye benzeyen tüm takım zinciri oldukça eski.

Apple OSX Lion ile hızlanıyor ama Leopard, Snow Leopard modern Linux dağıtımlarının oldukça gerisinde ve pek çok standart desteklenmiyor. Benim durumumda, RFC 3678 (Çok Noktaya Yayın Kaynak Filtreleri için Soket Arabirimi Uzantıları) eksikliği oldukça rahatsız edicidir.

OSX sunucusunda, HTTP sunumu için önerildiği şekilde büyük küçük harf duyarlı bir dosya sistemi kurdum.

  • Eski GCC
  • Eski Autoconf, Automake, libtool
  • Pthread spinlock yok, OSX doğal alternatifler sunuyor.
  • Çok sayıda kiracı olmayan NSS API'si yok.
  • Aşırı derecede yararlı olmayan bir /procdosya sistemi.
  • Hayır /dev/rtc, /dev/hpetve RDTSCanlaşılmış görünüyor. OSX yerel alternatifler sunar.
  • Hayır epoll, ama sen pollkazandın

1

OS X destekliyor, pthread_cond_timedwaitancak mutlak takvim süresini kullanıyor ve monoton olarak artan bir zaman kullanmanın yolu yok.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.