gpt4 book ai didi

xcode6 - xcode 6.1 构建失败,出现错误 "Apple LLVM 6.0 error: compiler does not support ' fapple-kext'"

转载 作者:行者123 更新时间:2023-12-03 18:40:13 27 4
gpt4 key购买 nike

在 xcode 6.1 上为我们的 USB 设备构建 USB 驱动程序 kext,build设置 Architecture= Universal(32/64bit 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).

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

最佳答案

通用构建错误与您正在运行的 OS X 版本无关,与 clang/Xcode 版本无关。您不能使用最新版本的 clang 为 i386 架构编译 kext。我认为支持 32 位 kexts 的最后一个 Xcode 版本是 4.6.3。 (可从 Apple 开发者网站的下载部分获得)请注意,您也不能对 32 位或通用 kext 进行代码设计,因此如果您打算同时支持 OS X < = 10.7 和 >= 10.9。您可以使用 Xcode 4.6.3 构建通用 kext,并使用 Xcode 6.x 构建签名版本。

链接/加载错误是由于您使用的 OS X SDK 版本造成的。一般来说,如果 z < y,不要指望基于 OS X SDK 10.y 构建的基于 I/O 套件的 kext 可以在 OS X 10.z 上加载。因此,如果您需要支持 10.8,请使用 10.8 SDK(或更早版本)构建。如果您想支持仅在较新的 SDK 中可用的功能,则需要创建多个 kext 版本(如果您想支持 10.7 或更低版本,则无论如何都需要这样做)或拥有适用于所有支持版本的基本 kext ,以及一个增强的 kext,它依赖于基本 kext 并添加了相关功能,但仅适用于较新的操作系统版本。您当然需要返回到仍随所需 SDK 一起提供的 Xcode 版本。

合理的 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 年更新,因为这个答案目前似乎很流行,> 3 年后:

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

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

    在我们的一个构建脚本的准备阶段,我有以下 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) 版本的符号链接(symbolic link),编译器似乎正在寻找它。如果我没记错的话,Xcode 4.6.3 本身只附带了高达 10.9 或 10.10 的这些符号链接(symbolic link),但将它们添加到较新的版本似乎会让人高兴。我可以确认这适用于在 10.11 和 10.12 系统上使用 10.6 SDK 构建 32 位 kext 切片。

    一个更干净的解决方案可能是从源代码构建 llvm-gcc,但设置起来也可能更耗时。

    关于xcode6 - xcode 6.1 构建失败,出现错误 "Apple LLVM 6.0 error: compiler does not support ' fapple-kext'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27599342/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com