有没有办法用 Cargo 创建 C 库?

Posted

技术标签:

【中文标题】有没有办法用 Cargo 创建 C 库?【英文标题】:Is there a way to create C library with Cargo? 【发布时间】:2015-06-05 01:03:23 【问题描述】:

我需要创建一个绑定到现有 crate 的(静态)C 库。 Cargo 有什么方法可以为我创建这个 C 库吗?

我有一个 crate(例如 html5ever),我希望 Cargo 为该 crate 创建一个基于 C-API 的 C 库。

【问题讨论】:

你可以看看callbacks-from-c-code-to-rust-functions 【参考方案1】:

Cargo 有什么方法可以为我创建这个 C 库吗?

Cargo 目前没有此功能。

我有一个 crate(例如 html5ever),我希望 Cargo 为该 crate 创建一个基于 C-API 的 C 库。

它在 C 中是有原因的吗? C 可以直接调用 Rust 代码,你可以直接使用 html5ever,因为它存在。

【讨论】:

目前的问题是,html5ever 的人试图做的事情是让它的 C-API 由 Rust 创建,这样他们就可以摆脱唯一独特任务是创建 C_API 的 Makefile .基本上,转到 Cargo,删除 Makefile。 我很惊讶 Cargo 不允许某种 CLI 逃生舱口。【参考方案2】:

解决此问题的一种方法是创建一个特殊的 crate 来存储您的 C API。例如,如果您的库名为 foo,那么在您的主目录中,在 src/tests 旁边还有一个名为 capi 的文件夹,它将为 C API 存储一个特殊的 crate foo_capi

  foo
   |
   +--src
   | 
   +--test
   |
   +--capi
        | 
        +--include 
        |
        +--src 
        |
        Cargo.toml

include 文件夹包含 C 的头文件。

src 包含导出到 C 中的 Rust 文件。

Cargo 清单应该是静态链接的,并且依赖于项目 foo。例如查看 html5ever 中使用的 Cargo.toml。

【讨论】:

以上是关于有没有办法用 Cargo 创建 C 库?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用 maven 签出 git 存储库到某个文件夹?

有没有办法从 C++ 中区分文件?

在 C++11 或以上,有没有办法通过 lambda 实现单方法纯虚拟 C++ 接口?

有没有办法使用 NPOI/C# 将 HTML 表格转换为 xls / xlsx 文件?

如何配置 Maven Cargo 以使用嵌入式 Tomcat 6 服务器?

有没有办法在 GCC 或 cl.exe 的预处理和编译之间插入一个步骤?