当前位置: 首页 > 面试题库 >

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

方韬
2023-03-14
问题内容

有没有办法编译本机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


问题答案:

如果您使用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调用。



 类似资料:
  • 代码不编译。我不明白错误是什么,请帮忙) 错误文本:g-Wall-c“main.cpp”(/media/ad/4GB-NTFS/prog/laba2)main。cpp:In函数“int main()”:main。cpp:46:12:错误:调用“Record::Record()”记录r1;^主要的cpp:12:1:注意:候选者:Record::Record(std::\u cxx11::string

  • 本文向大家介绍在Linux下编译C或C++程序的教程,包括了在Linux下编译C或C++程序的教程的使用技巧和注意事项,需要的朋友参考一下 从开始学习C/C++我们都在是windows下,那么如何(怎样)在linux中编译C/C++代码?在linux终端下(命令行中)编译译C/C++代码? 在任何linux分支下编译C/C++代码,如 Ubuntu ,Red Hat, Fedora ,Debian

  • 本文向大家介绍ubuntu 下编译C++代码出现的问题解决,包括了ubuntu 下编译C++代码出现的问题解决的使用技巧和注意事项,需要的朋友参考一下 同样的代码, 同样的makefile 文件 1)在mac 下顺利编译; 2)在新的ubuntu 下,编译失败; 报错信息: string.h 中各种 函数找不到; makefile: ------------ 报错: 已经做的尝试: 在$PATH

  • 1.1. 代码编译 1.1.1. Openwrt编译 1.1.2. Kernel编译 1.1.3. Uboot编译 1.1.4. VSP编译 1.1. 代码编译 1.1.1. Openwrt编译 作为Kamino18 YODAOS的整体编译环境,使用openwrt可以编译出系统正常运行所需的主要image如下: 镜像名字 镜像运行位置 镜像说明 镜像生成位置 mcu.bin MCU The ima

  • 问题内容: 现在显然,解析器本身并没有什么用(除了静态分析)。我想将转换应用于AST,然后将其编译回源代码。应用转换不是什么大问题,普通的Visitor模式应该可以。 我目前的问题是如何将AST编译回源代码。我基本上看到两种可能性: 使用一些预定义的方案编译代码 保留原始代码的格式,并仅在已更改的节点上应用1.。 现在,我想专注于1.,因为2.似乎很难完成(但是,如果您有关于此的提示,我想听听他们

  • PHP代码的编译 PHP是解析型高级语言,事实上从Zend内核的角度来看PHP就是一个普通的C程序,它有main函数,我们写的PHP代码是这个程序的输入,然后经过内核的处理输出结果,内核将PHP代码"翻译"为C程序可识别的过程就是PHP的编译。 那么这个"翻译"过程具体都有哪些操作呢? C程序在编译时将一行行代码编译为机器码,每一个操作都认为是一条机器指令,这些指令写入到编译后的二进制程序中,执行