xcode 6.1 build失败,出现错误" Apple LLVM 6.0错误:编译器不支持' fapple-kext'"

时间:2014-12-22 08:51:01

标签: xcode6 kernel-extension

使用构建设置为xcode 6.1上的USB设备构建USB驱动程序kext架构=通用(32/64位Intel)和Base SDK = 10.8,构建失败并出现错误,

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).

请帮我解决如何为驱动程序解决此链接错误。

1 个答案:

答案 0 :(得分:4)

通用构建错误与您正在运行的OS X版本无关,以及与clang / Xcode版本相关的所有内容。您无法使用最新版本的clang来编译i386架构的kexts。我认为支持32位kexts的Xcode的最后一个版本是4.6.3。 (可从Apple开发者网站的下载部分获得)请注意,您也无法对32位或通用关键字进行编码,因此,如果您需要提供2个版本的kext,则需要#&# 39;重新计划支持OS X< = 10.7和> = 10.9。您可以使用Xcode 4.6.3构建通用kext,使用Xcode 6.x构建签名版本。

链接/加载错误是由您正在使用的OS X SDK版本引起的。一般情况下,如果z <1,则不要期望基于I / O工具包的针对OS X SDK 10.y构建的kex加载到OS X 10.z上。年。因此,如果您需要支持10.8,请使用10.8 SDK(或更早版本)进行构建。如果您想支持仅在较新的SDK中提供的功能,则需要创建多个kext版本(如果您想支持10.7或更低版​​本,您仍然需要执行此操作)或者具有适用于所有版本的基本kext支持的版本,以及依赖于基本kext并添加相关功能的增强型kext,但仅适用于较新的OS版本。您当然需要返回仍附带所需SDK的Xcode版本。

明智的OS X版本分组是:

  • Kext 1:&lt; = 10.7(无符号,通用),kext 2&gt; = 10.8(有符号,64位)
  • Kext 1:&lt; = 10.8(无符号,通用),kext 2&gt; = 10.9(有符号,64位)

如果您需要更多的功能粒度,您当然可以分成两个以上的kext版本。

请注意,您可以弱链接纯C符号,只有C ++链接存在问题。

2018年更新,因为此答案目前很受欢迎,> 3年后:

在现代系统上构建32位kexts有点棘手。最简单的方法是使用旧的OS X版本设置VM并在那里使用Xcode 4.6.3。但是,这会破坏针对现代操作系统版本的kexts和其他项目组件的构建,从而阻止您拥有构建所有内容的宏大统一构建。如果您使用可以从多个构建代理中提取构建工件的花哨CI系统进行设置,那么对于发布版本来说它很好,但它仍然是编辑 - 构建 - 调试的痛苦周期。

我发现的另一个解决方案是在现代macOS上使用旧的编译器。 Xcode 4本身并不在最新版本上运行,但可以说服编译器这样做,并生成正确的32位kexts。

我在其中一个构建脚本的准备阶段中有以下bash代码:

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

这将从Xcode 4.6.3软件包中取出32位编译器并将其放在本地构建目录中,然后在其名称中添加一个带有macOS(Darwin)版本的符号链接,编译器似乎在寻找它。如果我没记错的话,Xcode 4.6.3本身只附带那些符号链接,最高可达10.9或10.10,但是为新版本添加它们似乎让它很开心。我可以确认这适用于在10.11和10.12系统上使用10.6 SDK构建32位kext切片。

更清洁的解决方案可能是从源代码构建llvm-gcc,但设置也可能更耗时。