有没有办法编译本机C或C ++代码并将其公开给Linux上的Swift?我可以看到像libdispatch这样的几个Apple库都是用纯C语言编写的,您只需导入即可在Swift中访问它们。
举个例子,假设我有两个文件Car.c,Car.h并且定义了名为的结构Car。有没有一种方法可以通过编写import语句来编译它们并在Swift中使用它们?
Car.c
Car.h
Car
import Car
我试着写module.modulemap文件里面目录下.c,.h并且Package.swift文件位于:
module.modulemap
.c
.h
Package.swift
module Car { header "Car.h" export * }
和运行swift build。此产量错误:
swift build
<unknown>:0: error: unexpected 'commands' value (expected map) <unknown>:0: error: unable to load build file
我正在使用Swift版本3.0-dev(2016年3月24日)
[更新1]
我已经联系了Max(mxcl)-Swift Package Manager的创建者之一,他告诉我摆脱the,modulemap然后将.cand .h文件直接放在Sources文件夹中。在我完成该程序包的编译后,但无法作为模块使用。另外,我无法调用文件中的任何已定义函数.h。
modulemap
Sources
如果您使用C代码构建一个库,则可以为其创建一个 系统模块 ,然后将其导入到Swift中,请参见以下答案
解决此任务的另一种方法是创建桥接标头,如@Philip所建议。这是一个过于简化的示例。让我们考虑以下C代码:
/* In car.h */ int getInt(); /* In car.c */ int getInt() { return 123; }
我们将使用car.h作为桥接头。快速的来源是(在文件中junk.swift):
junk.swift
print("Hi from swift!") var i = getInt() print("And here is an int from C: \(i)!")
首先,创建一个目标文件,car.o从car.c:
car.o
car.c
gcc -c car.c
现在构建可执行文件,junk如下所示:
junk
swiftc -import-objc-header car.h junk.swift car.o -o junk
运行可执行文件将提供:
$ ./junk Hi from swift! And here is an int from C: 123!
该-import-objc-header选项是隐藏的。要查看它以及其他隐藏选项,请运行:
-import-objc-header
swiftc -help-hidden
我是从4月12日开始使用适用于Ubuntu 14.04的Swift 3.0开发快照来完成此操作的,可从以下位置获取:https : //swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT- SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- SNAPSHOT-2016-04-12-a-ubuntu14.04.tar.gz
现在,如果要使用C ,则需要创建一个包装器,该包装器以C源文件编写,并使用C++编译器进行编译,但是具有使用可以从C调用的函数extern"C"。然后可以将这些函数作为任何C函数从Swift调用。
extern"C"