Програма розробника програмного забезпечення, що переходить з Linux на OS X, що таке gotchas?


50

Я використовував Ubuntu / Fedora / Red Hat / Suse, але зовсім не використовував OS X. Якщо мені доведеться регулярно використовувати ОС X, на які речі я повинен звертати увагу?

Інструменти, які я використовую, - це ланцюжок інструментів GNU, C ++ / Boost тощо.


Ви збираєтесь розробляти більш звичайні додатки Unix / Linux або Mac OSX?
Девід Торнлі

1
Принаймні спочатку звичайніші програми Unix / Linux, я просто використовую ПК X X як робочу станцію.
grokus

Відповіді:


52

Я зробив такий самий хід років тому. Ось що я натрапив:

  • Ваш середній настільний Linux має багатішу користувачу, ніж ОС X.

    Ви, мабуть, пропустите інші інструменти, ніж я, тому немає сенсу конкретизувати рекомендації щодо заміни.

    Замість цього просто встановіть Fink , MacPorts або Homebrew . Ці системи забезпечують систему управління пакетами, типову для Linux або BSD. Кожен має свій смак та набір упаковок, тому правильний вибір буде залежати від ваших смаків та потреб.

    Ви можете виявити, що жодна система пакетів не матиме будь-якої необхідної вам програми. Деякі програми ще не перенесені на ОС X, тому вони не з’являться в жодній пакетній системі. Тим не менш, ці системи значно розширюють те, що поставляється з OS X, і полегшать ваш перехід з Linux.

  • Тепер компілятори командного рядка OS X створюють 64-бітні виконувані файли за замовчуванням.

    У Leopard та більш ранніх версіях компілятори створили 32-бітні виконувані файли за замовчуванням. Це може викликати проблеми декількома способами: можливо, у вас є старі 32-бітні бібліотеки, з якими ви не можете перебудовуватися, але до них потрібно зв’язатися, можливо, ви все ще працюєте з системою в 32-бітному режимі тощо.

    Один із способів змусити 32-бітну збірку - це переопрацювання gccзначень за замовчуванням у системах збирання gcc-4.0, що є старим компілятором Leopard 32-бітним за замовчуванням. ( gccє символьним посиланням на 64-бітовий за замовчуванням gcc-4.2у Snow Leopard.) У системах побудови на основі autoconf це працює:

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

    ( CXXБіт вам потрібен лише в тому випадку, якщо програма містить компоненти C ++.)

    Ще один спосіб - перейти -m32до компілятора та лінкера:

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

    Це більше вводити текст, але він дозволяє отримувати 32-бітні збірки з новішої GCC.

  • Динамічна зв'язок сильно відрізняється.

    Якщо ти такий, щоб писати ldкоманди вручну, саме час порушити цю звичку. Натомість вам слід зв’язувати програми та бібліотеки через компілятор або використовувати посередника на зразок libtool. Вони піклуються про особливості відмінної схеми зв’язків, що стосуються певної платформи, тому ви можете заощадити сили мозку для навчальних програм, яким не можна відмовитися від портативних механізмів.

    Наприклад, вам потрібно буде оновити м’язову пам’ять, щоб ви вводили, otool -L someprogramа ldd someprogramне з'ясовували, до яких бібліотек someprogramпов’язано.

    Ще одна відмінність динамічного зв’язку, яке спочатку закрутить ваш мозок, полягає в тому, що в OS X місце встановлення для бібліотеки записується в самій бібліотеці , а лінкер копіює її у виконуваний файл під час посилання. Це означає, що якщо ви посилаєтесь на бібліотеку, яку встановили, /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 вирішує проблему сумісності процесора інакше, ніж Linux.

    У 64-розрядному Linux з будь-якої причини вам також потрібно підтримувати 32-бітну версію, ви отримуєте дві копії речей, як бібліотеки, які мають бути в обох форматах, при цьому 64-бітні версії вимкнено в lib64каталозі, паралельному традиційний libкаталог.

    OS X вирішує цю проблему по-різному, завдяки універсальній бінарній концепції, яка дозволяє розміщувати кілька бінарних файлів в один файл. На даний момент ви можете мати виконавчі файли, які підтримують до 4 типів процесора: 32- та 64-розрядний PowerPC, а також 32- та 64-розрядний Intel.

    Створити універсальні бінарні файли за допомогою Xcode дуже просто, але це трохи болить інструменти командного рядка. Ви отримуєте універсальну збірку лише для Intel із системами побудови на основі Autoconf:

    $ ./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)що її також не потрібно будувати для другої платформи. У вищенаведеному прикладі все повинно будуватися двічі; чотири рази за повністю універсальний бінарний, якщо вам все ще потрібна підтримка PowerPC.

    (Докладніше в технічній записці Apple TN2137 .)

  • Інструменти для розробників не встановлені на OS X за замовчуванням.

    До Лева найнадійнішим місцем для отримання правильних інструментів розробки для вашої системи було диски ОС. Вони необов'язкові для встановлення.

    Приємна річ у встановленні інструментів розробників з дисків ОС - це те, що ви знаєте, що інструменти будуть працювати з ОС. Якщо Apple є Apple, для запуску найновіших компіляторів ви повинні мати останню версію ОС, і вони не завжди робили доступними завантаження старих інструментів, тому диски з ОС часто є найпростішим способом пошуку потрібних інструментів для даної програми розробник або тестовий ящик.

    У Lion вони намагаються покінчити із встановленням медіа, тому, якщо ви не купите дорогу версію USB-ключа, вам доведеться завантажити Xcode з App Store .

    Рекомендую зберегти принаймні кілька версій завантажених вами файлів Xcode DMG. Коли наступник Лева вийде через рік-три, то ви можете опинитися без способу встановити сучасну версію Xcode на тесті Lion VM. Плануйте заздалегідь, якщо проблеми з доступністю та відсутність носія ОС зроблять старі версії Xcode інакше недоступними.


2
+1: спеціально для згадування динамічного зв'язку. Мене зловили, думаючи, що це буде дуже схоже. Радість install_name та те, як динамічний редактор посилань OSX dyld, вирішує залежність!
Трубадур

Про збереження старих версій MacOS: я використовую Parallel для збереження відокремлених віртуальних машин із заданою версією OS X, якщо я хочу перевірити сумісність на відсталому рівні. Я рекомендую цей або подібний інструмент для тестування додатків.
ogerard

Для старих версій інструментів для розробників перегляньте connect.apple.com . Я щойно перевірив, і перше завантаження, перелічене в розділі Інструменти для розробників, - це Xcode 1.0 з 27 жовтня 2004 року для ОС X 10.3+. Немає ProjectBuilder, але проект SOP для Mac - це підтримка лише поточних та попередніх основних версій, тому 10.3+ є більш ніж достатньо.
Джеремі В. Шерман

@Jeremy: Оновлено. Я не хочу запевняти людей, що вони завжди будуть доступні для завантаження, оскільки вони не завжди були в минулому.
Воррен Янг

29

ВЕЛИЧЕЗНА ГОТЧА - файлова система Mac OS НЕ враховує регістри.


9
Щоб було зрозуміло, вони зберігають регістри і не залежать від регістру за замовчуванням. Так випадок вашого імені файлу буде збережений, але ви можете отримати доступ до нього через будь-яку варіацію регістру. Це можна змінити, щоб залежно від регістру було створено файльну систему.
KeithB

9
@KeithB: Однак багато основних програм для Mac не працюватимуть у файловій системі, що відрізняється від регістру, наприклад, Adobe CS відмовляється навіть від встановлення, а World of Warcraft не запуститься. Мене це спалило, і єдиний спосіб відновлення - це резервне копіювання та відновлення системи на переформатованому диску.
Ніл Мейхью

1
Це, головним чином, хитрість, коли ми маємо справу з контролем версій та роботою над проектом у команді з багатоплатформних програм.
Арафангіон

Я створив чутливий до регістру розсип, щоб вирішити це. На щастя, у мене є невикористаний розділ на цьому SSD.
dhchdhd

9

Хоча Fink і MacPorts є традиційними засобами отримання unix-пакетів на OS X, я б рекомендував перевірити новіший інструмент, який називається brew, який працює для мене краще і менше псується з моєю системою, і це набагато простіше у використанні. В основному він просто завантажує тарболи і встановлює в / usr / local, але це дуже добре автоматизує весь процес.

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


1
Домовились; Homebrew працює для мене набагато плавніше, ніж це робив MacPorts.
Джонік

4

ВЕЛИЧЕЗНА ГОТЧА - файлова система Mac OS НЕ враховує регістри.

На Mac OS X ви можете створити чутливе до регістру зображення диска, яке можна встановити як звичайний об'єм жорсткого диска.

# 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 та Windows до OSX єдиний головний момент, який привертає увагу, - це те, що, як FreeBSD, весь ланцюжок інструментів досить старий.

Apple прискорює роботу з OSX Lion, але Leopard, Snow Leopard значно відстають від сучасних дистрибутивів Linux, і багато стандартів не підтримуються. У моєму випадку мене вражає відсутність RFC 3678 (розширення інтерфейсу розетки для багатоадресних фільтрів), що є досить незручним.

На сервері OSX я встановив файлову систему з урахуванням регістру, оскільки це рекомендує робити для обслуговування HTTP.

  • Старий GCC
  • Старий Autoconf, Automake, libtool
  • Немає розгортань Pthread, OSX надає альтернативні варіанти.
  • Не багато API, що переорендовуються.
  • Не надто корисна /procфайлова система.
  • Ні /dev/rtc, /dev/hpetі, RDTSCсхоже, переповнений. OSX надає власні альтернативи.
  • Ні epoll, але у вас є pollі кк'ю

1

OS X підтримує, pthread_cond_timedwaitале він використовує абсолютний календарний час, і немає способу використовувати монотонно зростаючий час.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.