【问题标题】:Compiling and linking Swift plus Objective C code from the OS X command-line从 OS X 命令行编译和链接 Swift 和 Objective C 代码
【发布时间】:2014-07-30 15:42:15
【问题描述】:

从 OS X 命令行编译 Swift:

swift -sdk $(xcrun --show-sdk-path --sdk macosx) test.swift

从命令行编译 Objective C:

clang -lobjc -framework Foundation -c testObject.m

我可以将 -c 选项添加到任一编译器以生成 .o 文件。

如何将这两个源文件链接到一个应用程序中?

还是需要更多的构建?

【问题讨论】:

  • 你问的是完全不用 Xcode 6 吗?
  • 您需要安装 Xcode6 才能获得 Swift 工具。但是应该能够在不使用完整 IDE 的情况下从终端编译。

标签: objective-c macos linker swift


【解决方案1】:

TL;DR:最好使用 Xcode 工具,因为有很多事情要做。但也可以只使用命令行工具。

我会警告你,这是一个关于如何编译和运行.m.swift 文件的快速而肮脏的示例,链接到 Cocoa 和 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

你有一个使用该类的 Swift 文件:

$ cat S.swift
let c = C()

println(c.c)

您只需将 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

如您所见,我们必须手动包含框架和头文件路径,以让 Swift 编译器找到正确的文件(最好让它在 SDK 中查找它们,而不是在当前安装的文件中,顺便说一句(与xcrun --show-sdk-path))。

然后我们只需要链接它们,拉取所有 Swift 和 Objective-C 运行时库。由于swift默认拉取Objective-C库,我们甚至不需要指定太多:

xcrun swiftc -o app C.o S.o

看,我们的可执行文件已链接,我们可以运行它了!

$ ./app
Hello world!

这一切都非常有趣,但我建议不要直接使用这些工具,除非您实际上正在为您的项目构建一个以它们为目标的构建系统并且有充分的理由不使用 Xcode/xcodebuild

【讨论】:

  • 当前运行 swift 编译器需要swiftc 所以,例如:xcrun swiftc -o app C.o S.o
  • 谢谢telliot99,我现在修好了(抱歉耽搁了)。
  • 它不适用于版本 Apple Swift version 2.2 上的 swiftc 编译器。我收到以下错误:/Users/my-user/swift-objc/./C.h:1:9: error: could not build module 'Foundation' #import &lt;Foundation/Foundation.h&gt;/System/Library/Frameworks/ 内,我拥有所需的所有框架。你能帮帮我吗?
  • 更新 Swift 的更新:-F 应该是 /System/Library/Frameworks/Cocoaprintln 应该只是 print,这个示例将在 2017 年构建。
  • @uliwitness 这就是我在 Swift 5.2 上的工作:xcrun swiftc -c foo.swift -F /System/Library/Frameworks/Cocoa -I/usr/include
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多