首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >xcode 6.1编译失败,错误为“AppleLLVM6.0错误:编译器不支持‘fapple’”

xcode 6.1编译失败,错误为“AppleLLVM6.0错误:编译器不支持‘fapple’”
EN

Stack Overflow用户
提问于 2014-12-22 08:51:00
回答 1查看 3.6K关注 0票数 4

在xcode 6.1上为我们的USB设备构建USB驱动程序kext,内置设置为Architecture= Universal(32/64位Intel)和Base SDK=10.8,生成失败时出错,

代码语言:javascript
运行
复制
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

如果选择"Build only = Yes“,则相同的项目构建成功,但在这种情况下,kextload失败,10.8 OSX上有以下错误,但它在10.9 OSX上工作

代码语言:javascript
运行
复制
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).

请帮助我解决这个链接错误的驱动程序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-23 12:52:12

通用构建错误与您正在运行的OS版本无关,与clang/Xcode版本无关。您不能使用最近版本的clang来为i386体系结构编译kexts。我认为支持32位kexts的Xcode的最后一个版本是4.6.3。(可从苹果开发者网站的下载部分获得)注意,您也不能协同设计32位或通用kexts,所以如果您计划同时支持OS X <= 10.7和>= 10.9,则需要提供两个版本的kext。您可以用Xcode 4.6.3构建一个通用的kext,用Xcode 6.x构建签名版本。

链接/加载错误是由于您正在使用的OS版本造成的。通常,如果z< y,不要期望基于I/O工具包的基于OSXSDK10.y的kexts加载到OSX10.z上。因此,如果需要支持10.8,则使用10.8SDK(或更高版本)构建。如果您希望只支持在较新的SDK中可用的功能,则需要创建多个kext版本(如果您希望支持10.7或更低版本,则无论如何都需要这样做),或者有一个对所有支持的版本都有效的基kext,以及依赖于基本kext并添加相关功能的增强kext,但只适用于较新的OS版本。当然,您需要返回到仍然随所需SDK附带的Xcode版本。

合理的OS X版本分组如下:

  • Kext 1:<= 10.7 (无签名,通用),kext 2 >= 10.8 (签名,64位)
  • Kext 1:<= 10.8 (无签名,通用),kext 2 >= 10.9 (签名,64位)

当然,如果您需要更多的特性粒度,可以将您的kext分成多个版本。

请注意,您的可以针对纯C符号弱链接,只有C++链接是有问题的。

2018年更新,因为这个答案目前似乎很流行,>3年后:

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

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

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

代码语言:javascript
运行
复制
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 (达尔文)版本的符号链接,编译器似乎正在寻找该链接。如果我没记错的话,Xcode 4.6.3本身只附带10.9或10.10的符号链接,但是为新版本添加它们似乎会让它高兴。我可以确认这对于在10.11和10.12系统上使用10.6 SDK构建32位kext切片是可行的。

一个更清洁的解决方案可能是从源头上构建llvm gcc,但也可能需要更多的时间来建立。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27599342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档