【CXX】4.4 其他构建系统

news/2025/3/6 9:25:27/

你需要至少完成以下三件事:

  1. 生成CXX生成的C++绑定代码。

  2. 编译生成的C++代码。

  3. 将生成的目标文件与你的其他C++和Rust目标文件链接在一起。

并非所有构建系统都是平等的。如果你希望使用90年代的构建系统,尤其是如果你希望覆盖2个或更多构建系统(如automake+cargo)的限制并期望同时解决它们,那么请注意你的期望值要相应调整。

生成代码

当#[cxx::bridge]过程宏展开时,CXX的Rust代码生成会在Rust编译过程中自动进行,因此不需要特殊的构建步骤。

但C++端的绑定代码需要生成。你的选择有:

  1. 使用cxxbridge命令,这是一个独立的命令行工具,用于生成CXX的C++代码。配置你的构建系统来编译并调用这个工具。
$ cxxbridge src/bridge.rs --header > path/to/bridge.rs.h
$ cxxbridge src/bridge.rs > path/to/bridge.rs.cc

它被打包为cxxbridge-cmd crate发布在crates.io上,或者可以从CXX GitHub仓库的gen/cmd/目录中构建。

或者,基于cxx-gen crate构建你自己的代码生成器前端。目前这是非官方且不受支持的。

编译C++

随你喜欢。我们无法提供指导。

将C++和Rust链接在一起

当链接一个包含混合Rust和C++代码的二进制文件时,你需要选择使用Rust工具链(rustc)还是你已经深度调优的C++工具链。

生成的C++代码和由过程宏生成的Rust代码相互依赖。简单的示例可能只需要其中一种,但通常你的链接过程需要处理双向依赖。对于某些链接器(如llvm-ld),这根本不是问题。对于其他链接器(如GNU ld),–start-lib/–end-lib等标志可能会有所帮助。

Rust不会生成简单的独立.o文件,因此你不能直接将Rust生成的代码扔进现有的C++工具链链接器。相反,你需要选择以下选项之一:

  1. 使用rustc作为最终链接器。 使用-L <目录>和-l<库>参数传递任何非Rust库,和/或在你的Rust代码中使用#[link]指令。如果需要链接C/C++的.o文件,可以使用-Clink-arg=file.o。

  2. 使用你的C++链接器。 在这种情况下,你首先需要使用rustc和/或cargo生成一个Rust静态库目标(staticlib),并将其传递给你的外部链接器调用。

如果需要链接多个Rust子系统,你可能需要使用大量的extern crate语句来包含多个Rust rlib,生成一个单一的静态库。多个Rust静态库文件可能会冲突。

直接将Rust rlib传递给非Rust链接器是不支持的(但有时似乎有效)。


http://www.ppmy.cn/news/1577032.html

相关文章

Tomcat:Java Web应用的强大支撑

在Java Web开发的广阔天地里&#xff0c;Apache Tomcat以其稳定、高效和灵活的特性&#xff0c;成为了众多开发者和企业的首选服务器。作为Apache软件基金会的一个开源项目&#xff0c;Tomcat不仅为Java Servlet、JavaServer Pages&#xff08;JSP&#xff09;、Java Expressio…

MySQL常用命令大全(可复制使用)

MySQL常用命令大全&#xff08;可复制使用&#xff09; 基础命令 操作命令连接MySQL相关数据库mysql -u root(用户名) -p;查看所有数据库show databases;选择一个数据库use 数据库名;查看所有表show tables;查看表结构describe 表名&#xff1b;或 show columns from 表名;创…

0x03 http协议和分层架构

HTTP协议 简介 Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 http协议基于TCP协议&#xff1a;面向连接&#xff0c;安全基于请求-响应模型&#xff1a;一次请求对应一次响应HTTP协议是无状态的协议&#xff…

Python编程题

1.斐波那契数列 def fib(n):if n 1 or n 2:return 1else:return fib(n - 1) fib(n - 2) n int(input("输入要打印的斐波那契数的项数: ")) for i in range(1,n1):print(fib(i),end" ") 2.计算等差数列前n项和 使用列表保存一个首项为2&#xff0c;公…

< 自用文儿 > DELETED 设置速读 in Ubuntu24

systemctl 和 DELETED&#xff1a; 配置文件&#xff1a; vi /etc/systemd/system/ DELETED.service [Unit] DescriptionV2Ray Service Documentation DELETED Afternetwork.target nss-lookup.target[Service] #Usernobody CapabilityBoundingSetCAP_NET_ADMIN CAP_NET_BIN…

DeepSeek掘金——DeepSeek-R1驱动的金融分析师

DeepSeek掘金——DeepSeek-R1驱动的金融分析师 我们将专注于创建一个专门用于提取相关新闻见解的代理。该代理将利用 DeepSeek-R1 提供全面的市场洞察。 在当今快节奏的金融市场中,获取准确及时的信息对于做出明智的投资决策至关重要。想象一下,一位人工智能金融分析师能够分…

ReconDreamer:通过在线恢复构建驾驶场景重建的世界模型

24年11月来自极佳科技、北大、理想汽车和中科院自动化所的论文“ReconDreamer: Crafting World Models for Driving Scene Reconstruction via Online Restoration”。 ReconDreamer&#xff0c;通过逐步整合世界模型知识来增强驾驶场景重建。具体来说&#xff0c;DriveRestor…

Android ChatOn-v1.66.536-598-[构建于ChatGPT和GPT-4o之上]

ChatOn 链接&#xff1a;https://pan.xunlei.com/s/VOKYnq-i3C83CK-HJ1gfLf4gA1?pwdwzwc# 添加了最大无限积分 删除了所有调试信息 语言&#xff1a;全语言支持