2014-12-22 5 views
4

Создание драйвера USB kext для нашего устройства USB на xcode 6.1 с настройками сборки Архитектура = универсальная (32/64-битная Intel) и базовая SDK = 10,8, Build неудачно с ошибкой,Ошибка xcode 6.1 с ошибкой Ошибка Apple LLVM 6.0: компилятор не поддерживает «fapple-kext»

clang: error: the clang compiler does not support 'fapple-kext' for C++ on Darwin/i386 
Command /Applications/Xcode 2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang failed with exit code 1 

то же построить проект успешно, если выбрать «построить только Активная Архитектура = Да», но в этом случае kextload не удалось со следующими ошибками на 10.8 OSX, но он работал на 10,9 OSX

Dec 19 17:36:22 localhost com.apple.kextd[16]: Failed to load /System/Library/Extensions/gdmuwm.kext - (libkern/kext) link error. 
Dec 19 17:36:22 localhost kernel[0]: kxld[com.gct.driver.gdmuwm]: The super class vtable '__ZTV12IOUserClient' for vtable '__ZTV13GdmUserClient' is out of date. Make sure your kext has been built against the correct headers. 
Dec 19 17:36:22 localhost kernel[0]: kxld[com.gct.driver.gdmuwm]: The super class vtable '__ZTV19IOEthernetInterface' for vtable '__ZTV5gdmif' is out of date. Make sure your kext has been built against the correct headers. 
Dec 19 17:36:22 localhost kernel[0]: kxld[com.gct.driver.gdmuwm]: The super class vtable '__ZTV20IOEthernetController' for vtable '__ZTV6gdmuwm' is out of date. Make sure your kext has been built against the correct headers. 
Dec 19 17:36:22 localhost kernel[0]: Can't load kext com.gct.driver.gdmuwm - link failed. 
Dec 19 17:36:22 localhost kernel[0]: Failed to load executable for kext com.gct.driver.gdmuwm. 
Dec 19 17:36:22 localhost kernel[0]: Kext com.gct.driver.gdmuwm failed to load (0xdc008016). 
Dec 19 17:36:22 localhost kernel[0]: Failed to load kext com.gct.driver.gdmuwm (error 0xdc008016). 

Пожалуйста, помогите мне, как устранить эту ошибку ссылки для driv э.

ответ

4

Ошибка универсальной сборки не имеет ничего общего с версией 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 из источника, но, вероятно, потребуется больше времени для настройки.