2009-11-19 3 views
2

Я планирую выпустить некоторый скомпилированный код, который должен быть связан клиентскими приложениями на MacOSX.Распространение бинарной библиотеки на OSX

Распределение является своего рода библиотека кода и набор заголовочных файлов, определяющий общий интерфейс для кода library.The внутренне C++, но ее внешний интерфейс (т.е. то, что показывается в заголовках) полностью C.

это мои требования или по крайней мере то, что я надеюсь, что смогу выполнить:

  • Я хочу, чтобы моя библиотека, чтобы быть агностиком , насколько это возможно для какой версии OSX и GCC пользователь работает. Имея отдельные библиотеки для 64 бит и 32 бит все в порядке.
  • Я хочу, чтобы моя библиотека была загружаема с языков, которые поддерживает загрузку библиотек C, таких как python или аналогичные.
  • Я хочу, чтобы мои библиотеки были внутренними символами, которые должны быть изолированы от кода, в котором оно находится . Я не хочу иметь ошибки дубликатов символов, так как так же называют внутреннюю функцию . Мой код на C++ правильно помещается в имена, поэтому это может быть не так уж и важно, но некоторые из библиотек, на которые я полагаюсь, являются C и могут быть проблемой (см. Следующий пункт).
  • Я хочу, чтобы моя библиотека зависимости были безопасными. Моя библиотека зависит от некоторых библиотек, таких как Libpng, импульс и СТЛ, и я не хочу проблем, потому что некоторые пользователи не обязательно все они установлены или получить проблемы, потому что они были собраны с другими флагами или имеют разные версии, чем у меня.

В Windows я использую DLL с библиотекой экспорта и ставя статистику всех моих зависимостей в DLL. Он удовлетворяет всем вышеперечисленным критериям, и если я могу получить тот же результат на OSX, это было бы здорово, однако я слышал, что динамические библиотеки, как правило, не изолируют символы на mac таким же образом.

Есть ли какая-то передовая практика для этого на OSX?

ответ

2

Нормальный OS X.dylib в значительной степени удовлетворяет вашим требованиям, с учетом того, что вы захотите иметь файл экспорта, который использует компоновщик, чтобы точно определить, какие символы экспортированы (чтобы предотвратить утечку ваших внутренних символов).

Чтобы сделать ваши собственные зависимости в библиотеке безопасными, вам, вероятно, потребуется либо включить эти библиотеки в свои, либо связать их статически в вашей библиотеке.

редактировать: Чтобы ответить на последующий вопрос о том, как применять экспорт файла в команде ссылку, страница человек для ld имеет сказать следующее:

-exported_symbols_list filename 
    The specified filename contains a list of global symbol names 
    that will remain as global symbols in the output file. All 
    other global symbols will be treated as if they were marked 
    as __private_extern__ (aka visibility=hidden) and will not be 
    global in the output file. The symbol names listed in file- 
    name must be one per line. Leading and trailing white space 
    are not part of the symbol name. Lines starting with # are 
    ignored, as are lines with only white space. Some wildcards 
    (similar to shell file matching) are supported. The * 
    matches zero or more characters. The ? matches one charac- 
    ter. [abc] matches one character which must be an 'a', 'b', 
    or 'c'. [a-z] matches any single lower case letter from 'a' 
    to 'z'. 

Итак, если ваша библиотека имело только две функции, которые вы хотели публиковать, позволяет называть их foo и bar, и они были функциями C (поэтому имена символов не искажены), ваш файл экспорта (назовем его myLibrary.exports) будет содержать эти две строки:

_foo 
_bar 

и, возможно, некоторые комментарии и т. Д. Когда вы выполните окончательный шаг ссылки на сборку библиотеки, вы передадите флаг -exported_symbols_list myLibrary.exports в компоновщик. Это имеет дополнительное преимущество, которое приведет к сбою, если вы не предоставите один из экспортированных символов; это может ловить много «oops, я забыл включить этот файл в сборку».

Конечно, вам не нужно использовать средства командной строки, чтобы сделать все это. В настройках сборки для динамической библиотеки в XCode вы найдете Exported Symbols File (по умолчанию не определено); установите его на путь к вашему файлу экспорта, и он будет передан компоновщику.

+0

Это похоже на хорошее решение. Есть ли у вас хорошая рекомендация о том, как создать файл экспорта? – Laserallan

+0

Я добавил некоторые подробности о том, как использовать файл экспорта; для того, как его создать, если библиотека не слишком большая, я обычно использую nm для получения списка всех символов, а затем удаляю те, которые я хочу сохранить в привате. Для больших проектов это не очень эффективный подход, поэтому я обычно пишу скрипты для создания файла для меня. –

+2

Также обратите внимание, что нет необходимости в отдельных 32- и 64-разрядных библиотеках; OS X позволяет использовать dylib, поддерживающие несколько архитектур. Он немного запутан из командной строки, но если вы используете XCode, он должен просто работать. –

1

Ключевым термином, который вам нужен, является «каркас». Вам нужно создать «универсальную» структуру, которая является самодостаточной. («Универсальный» - это простота Apple для компиляции в несколько раз и пакет в одну библиотеку.) Это не так просто, как на Windows с точки зрения инкапсуляции, но есть необходимые параметры компоновщика.

Смежные вопросы