【发布时间】: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 <IOKit/KextManager.h>^~~~~~~~~~~~~~~~~~~~~ 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 <IOKit/KextManager.h>
【问题讨论】:
-
这与生锈无关。
-
也许有人在 Mac 上使用 rust-bindgen 时遇到过类似的问题...
-
似乎包括编译器/链接器命令对于任何人都能够提供帮助至关重要。
-
@Shepmaster 所以你的问题部分解决了这个问题,当使用
clang -framework IOKit -framework Foundation main.m -o main命令编译时 - 它编译正常。现在需要让 bindgen 包含这些内容。
标签: objective-c macos