如何在 C++/Qt/CMake 项目中构建 Rust 代码

问题描述

我有一个使用 CMake 构建的现有 C++/Qt 项目,我想开始添加 Rust 代码,并能够从主 C++ 代码库中调用这些 Rust 代码。应该如何组织项目结构?

现有项目结构
./CMakeLists.txt
./subproject-foo/CMakeLists.txt
./subproject-foo/src/...
./subproject-bar/CMakeLists.txt
./subproject-bar/src/...
./common/CMakeLists.txt
./common/src/...

我想添加一个类似结构的 common-rust/ 目录。

解决方案

为了在 CMake 项目中集成 Rust 代码,可以使用 ExternalProject 模块,它可以用于构建不使用 CMake 的外部依赖项。

Rust 项目设置

假设你有一个 common-rust 子目录,其 Cargo.toml 文件如下:

[package]
name = "rust_example"
version = "0.1.0"[lib]
name = "rust_example"
crate-type = ["staticlib"]

并且在 lib.rs 文件中定义一个函数 add

#[no_mangle]
pub extern fn add(lhs: u32, rhs: u32) -> u32 {lhs + rhs
}
CMake 项目设置

在顶层的 CMakeLists.txt 文件中,可以这样配置:

add_executable(Example cpp/main.cpp)# 启用 ExternalProject CMake 模块
include(ExternalProject)# 设置 ExternalProject 的根目录
set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/Rust)# 将 rust_example 添加为 CMake 目标
ExternalProject_Add(rust_exampleDOWNLOAD_COMMAND ""CONFIGURE_COMMAND ""BUILD_COMMAND cargo build --releaseBINARY_DIR "${CMAKE_SOURCE_DIR}/common-rust"INSTALL_COMMAND ""LOG_BUILD ON)# 创建 Example 对 rust_example 的依赖关系
add_dependencies(Example rust_example)# 指定 Example 的链接库
target_link_libraries(Exampledebug "${CMAKE_SOURCE_DIR}/common-rust/target/debug/librust_example.a"optimized "${CMAKE_SOURCE_DIR}/common-rust/target/release/librust_example.a"ws2_32 userenv advapi32)set_target_properties(Example PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON)

请注意,这里依赖于 Cargo 在路径中可用。

示例 C++ 代码

cpp/main.cpp 文件内容如下:

#include <cstdint>
#include <iostream>extern "C" {uint32_t add(uint32_t lhs, uint32_t rhs);
}int main() {std::cout << "1300 + 14 == " << add(1300, 14) << '\n';return 0;
}
平台依赖

对于非 Windows 平台,需要修改链接的系统库。例如,在 macOS 上需要链接 m, c, System, resolv 库。

另一种方案

可以使用 Corrosion 项目,它简化了 CMake 与 Cargo 项目的集成。在 CMakeLists.txt 文件中添加以下内容:

find_package(Corrosion REQUIRED)
corrosion_import_crate(MANIFEST_PATH ${CMAKE_SOURCE_DIR}/common-rust)
参考资料
  • 使用 ExternalProject 构建外部项目
  • Corrosion 项目 GitHub 页面

这样配置之后,您应该可以成功将 Rust 代码集成到现有的 C++/Qt/CMake 项目中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/34542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat(1)

Tomcat(1) 1.Tomcat简介 Tomcat和Nginx、Apache(http)、Web服务器一样&#xff0c;具有处理HTML面的功能&#xff0c;不过tomcat处理静态HTML能力不如nginx服务器 一个tomcat默认并发数是200(官方) 使用方案&#xff1a; nginx和tomcat配合&#xff0c;nginx处理静态&#x…

万物皆对象,你信吗?

**内存空间和数据都消失&#xff0c;数据怎么会消失的&#xff1f;**空间没了&#xff0c;数据自然也跟着消失。因为数据就是在空间里面的。就像宇宙大爆炸&#xff0c;我们还能存在嘛&#xff0c;是不是已经undefined了。「一块小内存上有2种数据类型」 内部存储的数据 地址值…

Trilium Notes浏览器插件保存网页内容到docker私有化部署

利用Trilium浏览器插件可以很方便的把网页内容保存到Trilium&#xff0c;需要先在docker部署好trilium&#xff0c;还没有部署的可以先看这篇文章&#xff1a;trilium笔记私有化部署-www.88531.cn资享网 1.下载Trilium浏览器插件&#xff1a;https://www.npspro.cn/33462.html…

高考志愿填报秘籍:工具篇

选择适合自己的大学和专业&#xff0c;对广大考生来说至关重要。从某种程度上来说&#xff0c;决定了考生未来所从事的行业和发展前景。为了帮助广大考生更加科学、合理地填报志愿&#xff0c;选择适合自己的大学和专业&#xff0c;本公众号将推出如何用AI填报高考志愿专栏文章…

Linux `screen` 命令详解与使用指南

Linux screen 命令详解与使用指南 在Linux系统中&#xff0c;screen 是一个非常有用的工具&#xff0c;它允许用户在单个终端会话中运行多个进程&#xff0c;并能在会话之间切换。screen 特别适用于远程登录&#xff08;如通过SSH&#xff09;时&#xff0c;确保即使网络连接断…

华为200人园区网有线和无线

实验描述&#xff1a; 1 内网有有线业务、内部无线、外部无线三种业误。 2 内网服务器配置静态IP&#xff0c;网关192.168.108.1。 3 sW1和R1之间使用v1an200 192.168.200.9/30 互联。 4 R2向运营商申请企业宽带并获得了1个固定公网IP&#xff1a; 200.1.1.1 子网掩码 255.255.…

JavaScript语法特性篇-空值合并运算符(??)

1、基本使用 空值合并运算符&#xff08;??&#xff09;英文名称为 Nullish coalescing operator&#xff0c;是一个逻辑运算符。 特性&#xff1a;当左侧的操作数为 null 或者 undefined 时&#xff0c;返回其右侧操作数&#xff0c;否则返回左侧操作数。 const foo nul…

Hyperf 在 NginxProxyManager 如何配置 websocket?

新建代理 填写域名等服务信息&#xff0c;选择支持WebSockets。 创建 SSL 编写nginx配置 location /message.io{proxy_pass http://<你的ip>:<对应端口号>;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upg…

ios生成随机颜色

写demo&#xff0c;太需要这个随机颜色了&#xff0c;每次都懒得写&#xff0c;从网上找&#xff0c;但是找出来的又都是良莠不齐&#xff0c;还需要再修改。 是在懒得修改&#xff0c;就找了一个合适的&#xff0c;从自己的博客找&#xff0c;减少筛选代码的成本。 OC版本 …

最新《pvz植物大战僵尸杂交版》整合安装包,全面支持Android、ios、Windows,附教程!

今天&#xff0c;阿星要聊聊最近全网大火的一款老游戏——《植物大战僵尸》杂交版。 虽然它不是什么3A大作&#xff0c;但在阿星的心里&#xff0c;它永远是那个让人回味无穷的经典。记得十年前&#xff0c;阿星和大多数玩家一样&#xff0c;玩的都是盗版。那时候的《植物大战…

MES管理系统中的仓库管理功能有哪些用途

在当今制造业迅猛发展的背景下&#xff0c;企业对于车间生产调度的需求日益迫切。为此&#xff0c;MES管理系统应运而生&#xff0c;它作为一款专注于车间生产调度的管理信息系统&#xff0c;正逐步成为制造业提升生产效率、优化资源配置的利器。特别是其在仓储和物流管理方面的…

YOLOv8进行对象检测与关键点定位:实时计算关键点间实际距离并可视化

主要功能如下&#xff1a; 该脚本主要实现了使用预训练的YOLO模型对输入图片进行对象检测与关键点定位&#xff0c;计算特定关键点之间的实际距离&#xff0c;并在图片上可视化这些信息&#xff08;包括边界框、关键点标记、实际距离文字标注&#xff09;&#xff0c;最后保存…

解决Java中的IllegalThreadStateException异常的方法

解决Java中的IllegalThreadStateException异常的方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;IllegalThreadStateException异…

代码随想录-Day38

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …

计算机基础——经典排序算法总结

1.选择排序 找到数组中最小的那个元素&#xff0c;其次&#xff0c;将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次&#xff0c;在剩下的元素中找到最小的元素&#xff0c;将它与数组的第二个元素交换位置。如此往复&#xff0c;直到将…

[已解决] AI2THOR-2.1.0的卡死问题

在使用一些数据集的时候&#xff0c;例如ALFRED&#xff0c;需要调用AI2THOR-2.1.0版本。调用如下的测试脚本测试AI2THOR-2.1.0的安装情况&#xff1a; from ai2thor.controller import Controllerc Controller() c.start() event c.step(dict(action"MoveAhead")…

01 Swift 基础语法(变量,常量,注释,整数,浮点数,元组)

Swift 介绍 Swift 是一门用于开发 iOS、macOS、watchOS 和 tvOS 应用的新编程语言。它以安全、快速和互动的特点而著称。Swift 提供了代码预览&#xff08;playgrounds&#xff09;功能&#xff0c;使程序员可以在不编译和运行应用程序的情况下&#xff0c;实时运行 Swift 代码…

React面试题(二)

说说React的事件机制 是什么 React基于浏览器的事件机制自身实现了一套事件机制&#xff0c;包括事件注册&#xff0c;事件的合成&#xff0c;事件派发等 在React中这套事件机制被称之为合成事件 合成事件&#xff08;SyntheicEvent&#xff09; 合成事件是React模拟原生DO…

如何实现CloudFlare免费内网穿透?

有时候我们可能需要用到内网穿透技术,将本机的资源开放到网络上供人访问! 但是有时候我们只需要将一个项目开放的时候,使用frp就有点不划算了,特别是近几年服务器的价格水涨船高,要知道使用frp需要一台服务器和一个域名才可以的,这不今天就告诉大家一个用cloudflare实现…

Python web 开发 flask 实践

1、前言 前文已经介绍了很多关于 python 的算法和脚本的写法&#xff0c;在本文将开启python的 web 的开发&#xff0c;和java 类似的&#xff0c;对于 web 开发也需要引入框架&#xff0c;对于 python 的 web 开发来说常见的有 flask 和 django 两种&#xff0c;在本文中将要…