Разработчик программного обеспечения переключается с Linux на OS X, что за ошибки?
50
Я использовал Ubuntu / Fedora / Red Hat / Suse, но не использовал OS X вообще. Если мне придется регулярно использовать OS X, на что мне стоит обратить внимание?
Инструменты, которые я использую - это цепочка инструментов GNU, C ++ / Boost и т. Д.
Собираетесь ли вы разрабатывать более традиционные приложения для Unix / Linux или Mac OSX?
Дэвид Торнли
1
По крайней мере, на первых порах больше обычных приложений Unix / Linux, я просто использую OS X PC в качестве рабочей станции.
grokus
Ответы:
52
Я сделал то же самое несколько лет назад. Вот вещи, с которыми я столкнулся:
Ваш обычный настольный Linux имеет более богатое пользовательское пространство, чем OS X.
Возможно, вы пропустите другие инструменты, чем я, поэтому нет смысла получать конкретные рекомендации по замене.
Вместо этого просто сначала установите Fink , MacPorts или Homebrew . Эти системы предоставляют систему управления пакетами, типичную для Linux или BSD. У каждого свой вкус и набор, поэтому правильный выбор будет зависеть от ваших вкусов и потребностей.
Вы можете обнаружить, что ни одна система пакетов не будет иметь все нужные вам программы. Некоторые программы еще не перенесены на OS X, поэтому они не будут отображаться ни в одной системе пакетов. Тем не менее, эти системы значительно расширяют возможности, поставляемые с OS X, и облегчат ваш переход с Linux.
Компиляторы командной строки OS X теперь по умолчанию создают 64-битные исполняемые файлы.
В Leopard и более ранних версиях компиляторы по умолчанию строили 32-битные исполняемые файлы. Это может вызвать проблемы по нескольким причинам: возможно, у вас есть старые 32-разрядные библиотеки, которые вы не можете восстановить, но на которые нужно ссылаться, возможно, вы все еще используете свою систему в 32-разрядном режиме и т. Д.
Один из способов заставить 32-битную сборку - это переопределить gccзначения по умолчанию в системах сборки gcc-4.0, которые являются старым 32-битным компилятором Leopard по умолчанию. ( gccявляется символической ссылкой на 64-битные по умолчанию gcc-4.2в Snow Leopard.) В системах сборки на основе autoconf это работает:
$ ./configure CC=gcc-4.0 CXX=g++-4.0
( CXXБит необходим только в том случае, если программа содержит компоненты C ++.)
Другой способ - перейти -m32к компилятору и компоновщику:
Это больше печатает, но позволяет вам получить 32-битные сборки из более нового GCC.
Динамическая связь сильно отличается.
Если вы тот, кто пишет свои ldкоманды от руки, пришло время избавиться от этой привычки. Вместо этого вы должны связывать программы и библиотеки через компилятор или использовать посредника, как libtool. Они учитывают различия в схемах соединений, характерных для конкретной платформы, так что вы можете сэкономить интеллектуальные ресурсы для программ обучения, которые невозможно абстрагировать с помощью переносимых механизмов.
Например, вам нужно обновить мышечную память, чтобы вы печатали, otool -L someprogramа не ldd someprogramвыясняли, с какими библиотеками someprogramсвязаны.
Другое различие в динамической компоновке, которая сначала изменит ваш мозг, заключается в том, что в OS X место установки библиотеки записывается в самой библиотеке , а компоновщик копирует ее в исполняемый файл во время компоновки. Это означает, что если вы ссылаетесь на библиотеку, в которую /usr/local/libвы установили, но хотите отправить ее своим пользователям в том же каталоге, что и исполняемый файл, вы должны сказать что-то вроде этого в процессе установки:
Теперь многое из вышеперечисленного может отличаться для вашей системы сборки, поэтому просто возьмите это в качестве примера, а не рецепта. Это делает частную копию библиотеки, на которую мы ссылаемся, изменяет идентификатор общей библиотеки с абсолютного пути на относительный, означающий «в том же каталоге, что и исполняемый файл», а затем принудительно перестраивает исполняемый файл для этой измененной копии. библиотеки.
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:
Если вы не отключите отслеживание зависимостей, вы закончите сборку только для одной платформы, так как наличие вновь созданных .oфайлов для первой платформы убеждает в make(1)том, что не нужно создавать также и для второй платформы. Все должно быть построено дважды в приведенном выше примере; четыре раза для полностью универсального двоичного файла, если вам все еще нужна поддержка PowerPC.
Инструменты разработчика не установлены в OS X по умолчанию.
До Lion самое надежное место, где можно было найти подходящие инструменты для вашей системы, находилось на дисках ОС. Это необязательная установка.
Хорошая вещь об установке инструментов dev с дисков ОС состоит в том, что вы знаете, что инструменты будут работать с ОС. Apple, Apple, вам нужна последняя версия ОС для запуска новейших компиляторов, и они не всегда делают доступными загрузку старых инструментов, поэтому диски с ОС часто являются самым простым способом найти нужные инструменты для данной задачи. dev или test box.
С Lion они пытаются покончить с установочными носителями, поэтому, если вы не купите дорогую версию USB-ключа, вам придется скачать Xcode из App Store .
Я рекомендую вам сохранить хотя бы несколько версий загруженных вами DMG Xcode. Когда преемник Lion выйдет через год или три, вы можете оказаться без способа установить современную версию Xcode на тестовую виртуальную машину Lion. Планируйте заранее на случай, если проблемы доступности и нехватки носителей ОС сделают старые версии Xcode иначе недоступными.
+1: специально для упоминания динамической связи. Меня поймали на мысли, что это будет очень похоже. Радость install_name и то, как редактор динамических ссылок OSX dyldустраняет зависимости!
Трубадур
О сохранении старых версий MacOS: я использую Parallel для хранения отдельных виртуальных машин с заданной версией OS X, если я хочу проверить обратную совместимость. Я рекомендую этот или аналогичный инструмент для тестирования приложений.
ogerard
Для старых версий инструментов разработчика, проверьте connect.apple.com . Я только что проверил, и первая загрузка, перечисленная в разделе Инструментов разработчика, является Xcode 1.0 от 27 октября 2004 для OS X 10.3+. Нет ProjectBuilder, но проекты SOP для Mac должны поддерживать только текущие и предыдущие основные выпуски, поэтому 10.3+ более чем достаточно.
Джереми У. Шерман
@ Джереми: Обновлено. Я не хочу уверять людей, что они всегда будут загружаемыми, так как они не всегда были в прошлом.
Уоррен Янг
29
ОГРОМНОЕ GOTCHA - файловая система Mac OS НЕ чувствительна к регистру.
Просто чтобы прояснить, они сохраняют регистр и не чувствительны к регистру по умолчанию. Таким образом, регистр вашего имени файла будет сохранен, но вы можете получить к нему доступ через любой вариант регистра. Это может быть изменено с учетом регистра при создании файловой системы.
KeithB
9
@KeithB: Однако многие основные приложения Mac не будут работать в чувствительной к регистру файловой системе, например, Adobe CS отказывается даже устанавливать, а World of Warcraft не запускается. Это сгорело у меня, и единственным способом восстановления было резервное копирование и восстановление моей системы на переформатированный диск.
Нил Мэйхью
1
Это в основном уловка, когда дело касается контроля версий и работы над проектом в многоплатформенной команде.
Арафангион
Я создал регистр с учетом регистра, чтобы обойти это. К счастью, у меня есть неиспользуемый раздел на этом SSD.
2012 г.,
9
Хотя Fink и MacPorts являются традиционными средствами получения пакетов Unix для OS X, я бы порекомендовал проверить новый инструмент под названием brew, который работал лучше для меня и меньше мешал с моей системой, и его намного проще использовать. Он просто загружает tar-архивы и устанавливает их в / usr / local, но он очень хорошо автоматизирует весь процесс.
При переносе сетевого стека из Solaris, BSD, Linux и Windows в OSX единственное главное, на что обращает внимание, это то, что, как и во FreeBSD, вся цепочка инструментов довольно старая.
Apple работает с OSX Lion, но Leopard и Snow Leopard отстают от современных дистрибутивов Linux, и многие стандарты не поддерживаются. В моем случае я столкнулся с отсутствием RFC 3678 (расширения интерфейса сокета для многоадресных исходных фильтров), что было довольно неудобно.
На сервере OSX я установил чувствительную к регистру файловую систему, поскольку она рекомендует делать это для обслуживания HTTP.
Старый GCC
Старый Autoconf, Automake, libtool
Нет спин-блокировки Pthread, OSX предоставляет нативные альтернативы.
Немногие API-интерфейсы NSS с повторной арендой.
Не слишком полезная /procфайловая система.
Нет /dev/rtc, /dev/hpetи, RDTSCкажется, навязчиво. OSX предоставляет нативные альтернативы.
Ответы:
Я сделал то же самое несколько лет назад. Вот вещи, с которыми я столкнулся:
Ваш обычный настольный Linux имеет более богатое пользовательское пространство, чем OS X.
Возможно, вы пропустите другие инструменты, чем я, поэтому нет смысла получать конкретные рекомендации по замене.
Вместо этого просто сначала установите Fink , MacPorts или Homebrew . Эти системы предоставляют систему управления пакетами, типичную для Linux или BSD. У каждого свой вкус и набор, поэтому правильный выбор будет зависеть от ваших вкусов и потребностей.
Вы можете обнаружить, что ни одна система пакетов не будет иметь все нужные вам программы. Некоторые программы еще не перенесены на OS X, поэтому они не будут отображаться ни в одной системе пакетов. Тем не менее, эти системы значительно расширяют возможности, поставляемые с OS X, и облегчат ваш переход с Linux.
Компиляторы командной строки OS X теперь по умолчанию создают 64-битные исполняемые файлы.
В Leopard и более ранних версиях компиляторы по умолчанию строили 32-битные исполняемые файлы. Это может вызвать проблемы по нескольким причинам: возможно, у вас есть старые 32-разрядные библиотеки, которые вы не можете восстановить, но на которые нужно ссылаться, возможно, вы все еще используете свою систему в 32-разрядном режиме и т. Д.
Один из способов заставить 32-битную сборку - это переопределить
gcc
значения по умолчанию в системах сборкиgcc-4.0
, которые являются старым 32-битным компилятором Leopard по умолчанию. (gcc
является символической ссылкой на 64-битные по умолчаниюgcc-4.2
в Snow Leopard.) В системах сборки на основе autoconf это работает:(
CXX
Бит необходим только в том случае, если программа содержит компоненты C ++.)Другой способ - перейти
-m32
к компилятору и компоновщику:Это больше печатает, но позволяет вам получить 32-битные сборки из более нового GCC.
Динамическая связь сильно отличается.
Если вы тот, кто пишет свои
ld
команды от руки, пришло время избавиться от этой привычки. Вместо этого вы должны связывать программы и библиотеки через компилятор или использовать посредника, какlibtool
. Они учитывают различия в схемах соединений, характерных для конкретной платформы, так что вы можете сэкономить интеллектуальные ресурсы для программ обучения, которые невозможно абстрагировать с помощью переносимых механизмов.Например, вам нужно обновить мышечную память, чтобы вы печатали,
otool -L someprogram
а неldd someprogram
выясняли, с какими библиотекамиsomeprogram
связаны.Другое различие в динамической компоновке, которая сначала изменит ваш мозг, заключается в том, что в OS X место установки библиотеки записывается в самой библиотеке , а компоновщик копирует ее в исполняемый файл во время компоновки. Это означает, что если вы ссылаетесь на библиотеку, в которую
/usr/local/lib
вы установили, но хотите отправить ее своим пользователям в том же каталоге, что и исполняемый файл, вы должны сказать что-то вроде этого в процессе установки:Теперь многое из вышеперечисленного может отличаться для вашей системы сборки, поэтому просто возьмите это в качестве примера, а не рецепта. Это делает частную копию библиотеки, на которую мы ссылаемся, изменяет идентификатор общей библиотеки с абсолютного пути на относительный, означающий «в том же каталоге, что и исполняемый файл», а затем принудительно перестраивает исполняемый файл для этой измененной копии. библиотеки.
install_name_tool
основная команда здесь. Если вместо этого вы хотите установить библиотеку в../lib
каталог относительно исполняемого файла,-id
аргумент должен быть@loader_path/../lib/libfoo.dylib
вместо этого.Джо Ди Пол написал хорошую статью по этому вопросу , с гораздо большим количеством деталей.
Динамическое связывание + сторонние пакеты могут вызвать головную боль на раннем этапе.
Скорее всего, вы столкнетесь с проблемами динамического связывания, как только начнете пытаться использовать библиотеки из сторонних пакетов, которые не устанавливают библиотеки в стандартные места. MacPorts делает это, например, устанавливая библиотеки
/opt/local/lib
, а не/usr/lib
или/usr/local/lib
. Когда вы столкнетесь с этим, хорошим решением проблемы будет добавление таких строк.bash_profile
:OS X решает проблему совместимости процессора иначе, чем Linux.
В 64-битном Linux, где по какой-либо причине вам также необходимо поддерживать 32-битную версию, вы получите две копии таких вещей, как библиотеки, которые должны быть в обоих форматах, с 64-битными версиями в
lib64
каталоге, параллельном традиционныйlib
каталог.OS X решает эту проблему по-другому, с универсальной двоичной концепцией, которая позволяет вам поместить несколько двоичных файлов в один файл. В настоящее время вы можете иметь исполняемые файлы, поддерживающие до 4 типов процессоров: 32- и 64-разрядный PowerPC, а также 32- и 64-разрядные Intel.
Создать универсальные двоичные файлы с помощью XCode легко, но немного неудобно с помощью инструментов командной строки. Это дает вам универсальную сборку только для Intel с системами сборки на основе Autoconf:
Добавьте
-arch ppc -arch ppc64
к,CFLAGS
иLDFLAGS
если вам нужна поддержка PowerPC.Если вы не отключите отслеживание зависимостей, вы закончите сборку только для одной платформы, так как наличие вновь созданных
.o
файлов для первой платформы убеждает вmake(1)
том, что не нужно создавать также и для второй платформы. Все должно быть построено дважды в приведенном выше примере; четыре раза для полностью универсального двоичного файла, если вам все еще нужна поддержка PowerPC.(Более подробную информацию можно найти в технической заметке Apple TN2137 .)
Инструменты разработчика не установлены в OS X по умолчанию.
До Lion самое надежное место, где можно было найти подходящие инструменты для вашей системы, находилось на дисках ОС. Это необязательная установка.
Хорошая вещь об установке инструментов dev с дисков ОС состоит в том, что вы знаете, что инструменты будут работать с ОС. Apple, Apple, вам нужна последняя версия ОС для запуска новейших компиляторов, и они не всегда делают доступными загрузку старых инструментов, поэтому диски с ОС часто являются самым простым способом найти нужные инструменты для данной задачи. dev или test box.
С Lion они пытаются покончить с установочными носителями, поэтому, если вы не купите дорогую версию USB-ключа, вам придется скачать Xcode из App Store .
Я рекомендую вам сохранить хотя бы несколько версий загруженных вами DMG Xcode. Когда преемник Lion выйдет через год или три, вы можете оказаться без способа установить современную версию Xcode на тестовую виртуальную машину Lion. Планируйте заранее на случай, если проблемы доступности и нехватки носителей ОС сделают старые версии Xcode иначе недоступными.
источник
dyld
устраняет зависимости!ОГРОМНОЕ GOTCHA - файловая система Mac OS НЕ чувствительна к регистру.
источник
Хотя Fink и MacPorts являются традиционными средствами получения пакетов Unix для OS X, я бы порекомендовал проверить новый инструмент под названием
brew
, который работал лучше для меня и меньше мешал с моей системой, и его намного проще использовать. Он просто загружает tar-архивы и устанавливает их в / usr / local, но он очень хорошо автоматизирует весь процесс.http://mxcl.github.com/homebrew/
источник
Вы можете создать чувствительный к регистру образ диска в Mac OS X, который можно подключить как обычный том жесткого диска.
источник
Вот хороший источник избранных статей для разработчиков, Список литературы по Какао:
http://osx.hyperjeff.net/Reference/CocoaArticles
(Это может быть особенно полезно, если однажды вы захотите воспользоваться специфическими вкусностями Mac OS X.)
источник
При переносе сетевого стека из Solaris, BSD, Linux и Windows в OSX единственное главное, на что обращает внимание, это то, что, как и во FreeBSD, вся цепочка инструментов довольно старая.
Apple работает с OSX Lion, но Leopard и Snow Leopard отстают от современных дистрибутивов Linux, и многие стандарты не поддерживаются. В моем случае я столкнулся с отсутствием RFC 3678 (расширения интерфейса сокета для многоадресных исходных фильтров), что было довольно неудобно.
На сервере OSX я установил чувствительную к регистру файловую систему, поскольку она рекомендует делать это для обслуживания HTTP.
/proc
файловая система./dev/rtc
,/dev/hpet
и,RDTSC
кажется, навязчиво. OSX предоставляет нативные альтернативы.epoll
, но у вас естьpoll
и kqueueисточник
OS X поддерживает,
pthread_cond_timedwait
но использует абсолютное календарное время, и нет возможности использовать монотонно увеличивающееся время.источник