Ошибка универсальной сборки не имеет ничего общего с версией OS X, которую вы используете, и все с версией clang/Xcode. Вы не можете использовать последние версии clang для компиляции kexts для архитектуры i386. Я думаю, что последняя версия Xcode для поддержки 32-разрядных kexts была 4.6.3. (доступно в разделе загрузки сайта разработчика Apple). Обратите внимание, что вы не можете кодировать 32-разрядные или универсальные kexts, так что вам нужно будет предоставить 2 версии вашего kext в любом случае, если вы планируете поддерживать как OS X < = 10,7 и> = 10,9. Вы можете создать универсальный kext с Xcode 4.6.3 и подписанную версию с Xcode 6.x.
Ошибка связи/загрузки из-за используемой версии OS X SDK. В общем, не ожидайте, что кеш-файлы, основанные на I/O, построены на OS X SDK 10.y загрузить на OS X 10.z, если z < y. Поэтому, если вам нужно поддерживать 10.8, создайте с помощью SDK 10.8 (или старше). Если вы хотите поддерживать функции, доступные только в новом SDK, вам нужно будет создать несколько версий kext (вам нужно будет это сделать в любом случае, если вы хотите поддерживать 10.7 или ниже) или иметь базовый kext, который работает для всех поддерживаемых версий , а также расширенный kext, который зависит от базового kext и добавляет соответствующие функции, но работает только для более новых версий ОС. Конечно, вам нужно вернуться к версии Xcode, которая по-прежнему поставляется с вашим необходимым SDK.
Разумные OS X, версия группировки:
- Kext 1: < = 10,7 (без знака, универсальные), Kext 2> = 10,8 (подписан, 64-бит)
- Kext 1: < = 10.8 (без знака, универсальный), kext 2> = 10.9 (подписанный, 64-разрядный)
Вы можете, конечно, разделить на более чем 2 версии вашего kext, если вам нужна дополнительная функция детализации.
Обратите внимание, что вы можете слабо связываться с чистыми символами C, проблема связана только с C++.
2018 Update, так как этот ответ кажется популярным на данный момент,> 3 года на:
Это немного сложнее, чтобы построить 32-разрядные кексты на современной системе. Самое простое - установить виртуальную машину со старой версией OS X и использовать там Xcode 4.6.3. Тем не менее, это испортит сборку для kexts и других компонентов проекта, ориентированных на современные версии ОС, так что это предотвратит создание крупной унифицированной сборки, которая будет строить все. Это отлично подходит для сборки релизов, если вы настроены с помощью фантазии CI-системы, которая может вытягивать артефакты сборки из нескольких агентов сборки, но это все еще больно для цикла редактирования-сборки-отладки.
Другое решение, которое я нашел, это использовать старый компилятор на современном macOS. Сам Xcode 4 не работает в последних версиях, но компилятор может быть убежден в этом и создает правильные 32-разрядные kexts.
У меня есть следующий код Баша на этапе подготовки одного из наших скриптов сборки:
VERBOSE=1
export XCODE463APP=`mdfind 'kMDItemCFBundleIdentifier = "com.apple.dt.Xcode" && kMDItemVersion = "4.6.3"' | head -n 1`
DARWIN_MAJOR=`uname -r | sed -E 's/^([0-9]+)\..*$/\1/'`
if [ -e "./build-tools/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" ] && [ -e "./build-tools/Developer/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2" ] ; then
if (($VERBOSE)); then
echo 32-bit kext compiler appears to be in place
fi
else
echo "Setting up 32-bit kext compiler toolchain"
mkdir -p "./build-tools/Developer/Toolchains"
mkdir -p "./build-tools/Developer/usr/"
cp -r "$XCODE463APP/Contents/Developer/Toolchains/XcodeDefault.xctoolchain" "./build-tools/Developer/Toolchains/"
cp -r "$XCODE463APP/Contents/Developer/usr/llvm-gcc-4.2" "./build-tools/Developer/usr/"
fi
if [ -h "./build-tools/Developer/usr/llvm-gcc-4.2/libexec/gcc/i686-apple-darwin${DARWIN_MAJOR}" ] || [ -e "./build-tools/Developer/usr/llvm-gcc-4.2/libexec/gcc/i686-apple-darwin${DARWIN_MAJOR}" ] ; then
if (($VERBOSE)); then
echo "32-bit kext compiler's Darwin-version-specific stuff appears to be set up"
fi
else
echo "Setting up 32-bit kext compiler's Darwin version specific symlink"
ln -s "i686-apple-darwin11" "./build-tools/Developer/usr/llvm-gcc-4.2/libexec/gcc/i686-apple-darwin${DARWIN_MAJOR}"
fi
Это вытаскивает 32-битный компилятор из пакета Xcode 4.6.3 и помещает его в локальных сборках затем добавляет символическую ссылку с версией macOS (Darwin) в ее имени, которую, похоже, ищет компилятор. Сам Xcode 4.6.3 поставляется с этими символическими ссылками до 10.9 или 10.10, если я правильно помню, но добавление их для более новых версий, похоже, делает его счастливым. Я могу подтвердить, что это работает для создания 32-разрядных фрагментов kext с 10.6 SDK в 10.11 и 10.12 системах.
Более чистым решением, вероятно, будет создание llvm-gcc из источника, но, вероятно, потребуется больше времени для настройки.