【问题标题】:Referencing macOS SDK header is not resolving when compiling with clang使用 clang 编译时无法解析引用 macOS SDK 标头
【发布时间】:2019-01-29 15:06:23
【问题描述】:

我正在尝试将我的 Rust 库与 macOS SDK 链接。尝试在 .m 文件中包含来自 macOS SDK 的标头并进行编译时,链接器返回错误。

代码示例:

#import <Foundation/Foundation.h>
#import <IOKit/KextManager.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"Something");
    }
    return 0;
}

错误:

main.m:11:9:致命错误:找不到“IOKit/KextManager.h”文件

#import &lt;IOKit/KextManager.h&gt;

    ^~~~~~~~~~~~~~~~~~~~~ 1 error generated.

当我引用完整路径时,标头会被包含在内,但对于某些未找到的类,我会收到其他链接器错误:

代码示例:

#import <Foundation/Foundation.h>
#import "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/IOKit.framework/Headers/kext/KextManager.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"Something");
    }
    return 0;
}

我得到的错误:

架构 x86_64 的未定义符号:“_NSLog”,已引用 从: _main in main-891267.o "___CFConstantStringClassReference",引用自: main-891267.o "_objc_autoreleasePoolPop" 中的 CFString,引用自: _main in main-891267.o "_objc_autoreleasePoolPush",引用自: main-891267.o ld 中的 _main:未找到体系结构 x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 到 见调用)

我怀疑这是因为其他标头没有正确解析。

如何使标头解析正常工作,以便所有内容不仅包括来自 Xcode 的工作?

此代码直接从 Xcode 编译和运行,没有任何额外的引用,但不是从终端编译:

#import <Foundation/Foundation.h>
#import "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/IOKit.framework/Headers/kext/KextManager.h"
//#import <IOKit/KextManager.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        CFDictionaryRef result = KextManagerCopyLoadedKextInfo(NULL, NULL);

        NSLog(@"%@", result);
    }
    return 0;
}

得到相同的链接器错误:

ld:警告:紧急:为 OSX 构建,但链接到 dylib (/usr/lib/libSystem.dylib) 为(未知)构建。注意:这将是一个 未来的错误。架构 x86_64 的未定义符号:
“_KextManagerCopyLoadedKextInfo”,引用自: _main in main-abff3c.o "_NSLog",引用自: _main in main-abff3c.o "___CFConstantStringClassReference",引用自: main-abff3c.o "_objc_autoreleasePoolPop" 中的 CFString,引用自: _main in main-abff3c.o "_objc_autoreleasePoolPush",引用自: main-abff3c.o ld 中的 _main:未找到架构 x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 到 见调用)

更新 2:

编译器命令:

clang -framework IOKit -framework Foundation main.m -o main

适用于标头的完整路径,但不适用于#include &lt;IOKit/KextManager.h&gt;

【问题讨论】:

  • 这与生锈无关。
  • 也许有人在 Mac 上使用 rust-bindgen 时遇到过类似的问题...
  • 似乎包括编译器/链接器命令对于任何人都能够提供帮助至关重要。
  • @Shepmaster 所以你的问题部分解决了这个问题,当使用clang -framework IOKit -framework Foundation main.m -o main 命令编译时 - 它编译正常。现在需要让 bindgen 包含这些内容。

标签: objective-c macos


【解决方案1】:

解决方案是将 Xcode 包含的框架链接到包含文件夹中。

对于稳定版本:

ln -s /Applications/Xcode.app/Contents/Frameworks/ /usr/local/include/

对于 Xcode 测试版:

ln -s /Applications/Xcode-beta.app/Contents/Frameworks/ /usr/local/include/

然后 KextManager 像这样导入:

#import &lt;IOKit/kext/KextManager.h&gt;

【讨论】:

    猜你喜欢
    • 2017-12-12
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多