OS X: преобразовать .dylib в .a / .o (динамический в статический)?

Предположим, я прочитал . , хотя я не думаю, что это актуально.


person Quuxplusone    schedule 21.08.2012    source источник


Ответы (1)


Intel Threading Building Blocks (TBB) доступен в виде двоичного кода для Windows, Mac и Linux. Если вы планируете использовать libtbb.dylib из дистрибутива Mac на iOS, то вам не повезло. Дистрибутив Mac ориентирован на Intel (32- и 64-разрядные версии). Поскольку iOS работает на процессорах ARM, вы не смогли бы ее использовать, даже если нашли способ преобразовать динамическую библиотеку в статическую.

Если вы нашли libtbb.dylib файл где-то еще, предназначенным для ARM, вы, вероятно, могли бы использовать его на iOS. На самом деле можно загружать динамические библиотеки на iOS. Взгляните на человека dlopen (3) страница.

Наконец, вы должны прочитать о Grand Central Dispatch (GCD) вместо этого это встроенная поддержка одновременного выполнения кода на многоядерном оборудовании в iOS и OS X.

person 0xced    schedule 03.09.2012
comment
Проголосовали за ссылку GCD. Одно только то, что стоит награды :) - person steipete; 03.09.2012
comment
@JavierSoto: Я на 99% уверен, что dlopen не работает на iOS (хотя, чтобы увеличить путаницу, я думаю, что есть способ заставить его работать в симуляторе). Я слышал, что Apple хочет, чтобы приложения были простыми и самодостаточными, и чтобы избежать ада DLL в App Store. Если кто-то успешно использовал дилиб в приложении для iOS, прокомментируйте. - person Quuxplusone; 03.09.2012
comment
Да, dlopen действительно работает на iOS. Вы не можете легко создавать дилибы с помощью Xcode, но их можно создать с помощью clang в командной строке. - person 0xced; 03.09.2012
comment
@ 0xced: Спасибо за предложения. TBB имеет открытый исходный код (GPLv2), поэтому доступны не только двоичные файлы. Я уже успешно построил его для ARM. github.com/Quuxplusone/tbb Я не думаю, что GCD можно заменить в нашем случае; нам нужен контроль над тем, какой поток выполняет какие задачи. Мы используем TBB для его структур данных concurrent_queue и concurrent_hash_map (в основном выполняя действия производителя / потребителя через concurrent_queue). Мы могли бы довольно легко заменить TBB на std::queue, защищенный std::mutex, но мы подозреваем, что реализация TBB более эффективна и содержит меньше ошибок. - person Quuxplusone; 03.09.2012
comment
@ 0xced: Это был ответ на мой комментарий? Извините, но я все еще не убежден. Фактически, любой, кто сделал это успешно, должен действительно прокомментировать здесь: stackoverflow.com/questions/3723856/ или здесь: stackoverflow.com/questions/3091037/ - person Quuxplusone; 03.09.2012
comment
Мой первый комментарий был ответом Хавьеру Сото. Динамическая загрузка кода на iOS определенно работает и на устройстве. У меня есть проект, в котором пакеты загружаются с помощью -[NSBundle load], который, я уверен, в конечном итоге вызывает dlopen. (Этот проект не был отправлен в App Store.) Однако код в пакете или dylib должен быть подписан с тем же профилем подготовки, что и приложение. Я думаю, что беспокойство Apple по поводу динамических библиотек связано не с адом DLL, а скорее с последствиями для безопасности загрузки и выполнения кода. - person 0xced; 04.09.2012
comment
Спасибо, 0xced! Как вы думаете, одобрят ли они такое приложение? или динамическая загрузка кода противоречит рекомендациям по проверке? - person Javier Soto; 04.09.2012
comment
@Quuxplusone, может быть, дизайн не должен заботиться о том, какие потоки выполняют какую задачу? Абстракция, которую предоставляет GCD, дает большую простоту, думая в терминах очередей и забывая о базовых потоках ... - person Javier Soto; 04.09.2012
comment
В соответствии с рекомендациями по проверке и лицензионным соглашением программы для разработчиков вы не можете устанавливать или загружать исполняемый код. Я думаю, что встраивание динамической библиотеки было бы прекрасно. Законное использование динамически кодируемого кода может заключаться, например, в простой поддержке нескольких версий ОС. - person 0xced; 05.09.2012