hot*_*aw2 14 macos linker objective-c swift
从OS X命令行编译Swift:
swift -sdk $(xcrun --show-sdk-path --sdk macosx) test.swift
Run Code Online (Sandbox Code Playgroud)
从命令行编译Objective C:
clang -lobjc -framework Foundation -c testObject.m
Run Code Online (Sandbox Code Playgroud)
我可以将-c选项添加到任一编译器以生成.o文件.
如何将这两个源文件链接到一个应用程序?
或者更需要建立?
fil*_*cab 26
TL; DR:最好使用Xcode工具,因为有很多东西正在进行中.但是只能使用命令行工具.
我会警告你,这是一个快速而又脏的例子,说明如何编译和运行一个.m与.swiftCocoa和Swift运行时链接的文件.我甚至都没有尝试遵循任何一方的最佳做法.
假设您有一个Objective-C类:
$ cat C.h
#import <Cocoa/Cocoa.h>
@interface C : NSObject
@property (retain) NSString *c;
@end
$ cat C.m
#import "C.h"
@implementation C
- (id)init {
self = [super init];
self.c = @"Hello world!";
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
你有一个使用该类的Swift文件:
$ cat S.swift
let c = C()
println(c.c)
Run Code Online (Sandbox Code Playgroud)
您只需要将Objective-C和Swift文件.o分别编译为文件:
xcrun clang C.m -o C.o -c
# Be sure to import the bridge header (our only header in this example)
xcrun swiftc -c S.swift -import-objc-header C.h -F /System/Library/Frameworks -I/usr/include
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我们必须手动包含框架和标头路径,以使Swift编译器找到正确的文件(最好让它在SDK中查找它们,而不是在当前安装的文件中,顺便说一下(与xcrun --show-sdk-path)).
然后我们只需要链接它们,拉动所有Swift和Objective-C运行时库.由于swift默认情况下会拉取Objective-C库,因此我们甚至不需要指定太多:
xcrun swiftc -o app C.o S.o
Run Code Online (Sandbox Code Playgroud)
看,我们的可执行文件是链接的,我们可以运行它!
$ ./app
Hello world!
Run Code Online (Sandbox Code Playgroud)
这一切都非常有趣,但我建议不要直接使用这些工具,除非你实际上为你的项目制作一个构建系统,并且有充分的理由不使用Xcode/xcodebuild.
| 归档时间: |
|
| 查看次数: |
9715 次 |
| 最近记录: |