在xcode 6.1上为我们的USB设备构建USB驱动程序kext,内置设置为Architecture= Universal(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
如果选择"Build only = Yes“,则相同的项目构建成功,但在这种情况下,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).
请帮助我解决这个链接错误的驱动程序。
发布于 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分成多个版本。
请注意,您的可以针对纯C符号弱链接,只有C++链接是有问题的。
2018年更新,因为这个答案目前似乎很流行,>3年后:
在现代系统上构建32位的kexts有点棘手。最简单的方法肯定是使用旧的OS版本来设置VM,并在那里使用Xcode 4.6.3。然而,这会使kexts和其他针对现代OS版本的项目组件的构建变得混乱,从而使您无法拥有构建所有内容的大型统一构建。如果您设置了一个可以从多个构建代理中提取构建工件的高级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 (达尔文)版本的符号链接,编译器似乎正在寻找该链接。如果我没记错的话,Xcode 4.6.3本身只附带10.9或10.10的符号链接,但是为新版本添加它们似乎会让它高兴。我可以确认这对于在10.11和10.12系统上使用10.6 SDK构建32位kext切片是可行的。
一个更清洁的解决方案可能是从源头上构建llvm gcc,但也可能需要更多的时间来建立。
https://stackoverflow.com/questions/27599342
复制相似问题