一尘不染

编译C代码并将其公开给Linux下的Swift

linux

有没有办法编译本机C或C
++代码并将其公开给Linux上的Swift?我可以看到像libdispatch这样的几个Apple库都是用纯C语言编写的,您只需导入即可在Swift中访问它们。

举个例子,假设我有两个文件Car.cCar.h并且定义了名为的结构Car。有没有一种方法可以通过编写import语句来编译它们并在Swift中使用它们?

import Car

我试着写module.modulemap文件里面目录下.c.h并且Package.swift文件位于:

module Car {
   header "Car.h"
   export *
}

和运行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


阅读 314

收藏
2020-06-03

共1个答案

一尘不染

如果您使用C代码构建一个库,则可以为其创建一个 系统模块
,然后将其导入到Swift中,请参见以下答案

解决此任务的另一种方法是创建桥接标头,如@Philip所建议。这是一个过于简化的示例。让我们考虑以下C代码:

/* In car.h */
int getInt();

/* In car.c */
int getInt() { return 123; }

我们将使用car.h作为桥接头。快速的来源是(在文件中junk.swift):

print("Hi from swift!")
var i = getInt()
print("And here is an int from C: \(i)!")

首先,创建一个目标文件,car.ocar.c

gcc -c car.c

现在构建可执行文件,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选项是隐藏的。要查看它以及其他隐藏选项,请运行:

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调用。

2020-06-03