#objective-c #c #macos #cocoa #dylib
#objective-c #c #macos #какао #dylib
Вопрос:
Вчера я столкнулся с проблемой, когда моя программа завершилась сбоем как 32-разрядный процесс.
У меня был dylib, скомпилированный как 64-разрядный, и я использовал его в 64-разрядном приложении. Но когда я переключил его на 32-разрядный для тестирования и попытался загрузить, это не сработало. dlopen() вернул NULL?
Нужно ли мне иметь 32-разрядный и 64-разрядный dylib для 32-разрядного и 64-разрядного двоичных файлов соответственно? Есть ли какие-либо обходные пути?
Ответ №1:
Да, вам нужны 32-разрядные библиотеки для 32-разрядных процессов и 64-разрядные библиотеки для 64-разрядных процессов. Обходного пути нет.
Комментарии:
1. Строго говоря, существует «обходной путь» создания 32-разрядного процесса для передачи вызовов в библиотеку через какую-либо форму IPC, но я бы не стал этого делать, если бы это не было действительно абсолютно необходимо.
2. Есть лучший «обходной путь»: создайте все библиотеки как двоичные файлы fat (мультиархитектуры), чтобы их можно было использовать как из 32-, так и из 64-разрядных процессов.
Ответ №2:
- Вы можете создавать 32-разрядные двоичные файлы с помощью 64-разрядного компилятора и наоборот.
- Вы можете создавать и запускать 64-разрядные двоичные файлы при загрузке на 32-разрядном ядре и наоборот.
- Вы не можете связать 32-разрядные сборки с 64-разрядными двоичными файлами или наоборот.
Комментарии:
1. Пункт 2 неверен. Обычно вы не можете запускать 64-разрядный код на 32-разрядной ОС (без учета виртуализации) на x86.
2. Пункт 2 верен для OS X — он может нормально запускать 64-разрядные процессы под 32-разрядным ядром. Фактически, это было возможно с версии 10.4, хотя она не включала 64-разрядное ядро до 10.6 (и обычно не использовала 64-разрядное ядро до 10.7).