rust windows 交叉编译_交叉编译和静态链接 RUST 库

在 CSIS 中,我们过去使用 Python 编写后端,同时为 Incident Response Toolkit 编写一些 C/C++ 代码。

几年前,主要是由于性能原因,我们开始用 Rust 替换 Python 重写了一些特定的后端服务,并取得了巨大的成功。现在,为了便于开发和测试,我们正在探索将 C/C++ 代码库的某些部分也迁移到 Rust 的方法。

为了做到这一点,我们决定尝试将Rust集成到现有的代码库中,而不是一次重写所有内容。

下面是我们实验的摘要,以及编写一个Rust库并从 C/C++ 应用程序调用它的框架。

TARGETS

为了能够交叉编译代码,我们需要确保安装了相应的 target。可用的targets可以用过 rustc --print target-list 或 rustup target list 查看,可以通过 rustup target add 安装新的 target。

查看已经安装的 targets 可以用 rustup show:

$ rustup show

Default host: x86_64-unknown-linux-gnu

installed toolchains

--------------------

stable-x86_64-unknown-linux-gnu (default)

nightly-x86_64-unknown-linux-gnu

installed targets for active toolchain

--------------------------------------

i686-pc-windows-gnu

i686-pc-windows-msvc

i686-unknown-linux-gnu

i686-unknown-linux-musl

x86_64-pc-windows-gnu

x86_64-pc-windows-msvc

x86_64-unknown-linux-gnu

x86_64-unknown-linux-musl

active toolchain

----------------

stable-x86_64-unknown-linux-gnu (default)

rustc 1.31.0 (abe02cefd 2018-12-04)

项目设置

target 正确设置好后,我们需要设置项目,从 Cargo.toml 开始 :

[package]

name = "mylib"

version = "0.1.0"

authors = ["john doe"]

[dependencies]

libc = "*"

[lib]

crate-type = ["staticlib"]

现在我们的库的源代码src/lib.rs :

extern crate libc;

use libc::uint32_t;

#[no_mangle]

pub extern "C" fn addition(a: uint32_t, b: uint32_t) -> uint32_t {

a + b

}

以及应用程序调用者的源代码 caller.cpp:

#include

#include

extern "C" {

uint32_t

addition(uint32_t, uint32_t);

}

int main(void) {

uint32_t sum = addition(1, 2);

printf("%u\n", sum);

}

如果这是个 C 应用,只需要删除extern "C" 。

接下来,我们需要指定我们想要的 target, 这是在.cargo/config 中完成的, 比如:

[build]

target="i686-pc-windows-gnu"

LINUX 二进制文件

为了静态链接 Linux 二进制文件,我们需要将 target 设置为 -linux-musl。.cargo/config

或者,对于 64 位 二进制文件,我们可以选择 x86_64-unknown-linux-musl。

[build]

target="i686-unknown-linux-musl"build

$ g++ -m32 -c -o linux_cpp_caller.o caller.cpp

$ g++ -static -m32 linux_cpp_caller.o -o linux_cpp_caller \

-L./target/i686-unknown-linux-musl/debug/ -lmylib

如果我们的目标是 64 位,我们需要删除 -m32选项,并相应的调整 -L 标志。

WINDOWS 二进制文件

为了静态链接 Windows 二进制文件,我们需要将 target 设置为 -pc-windows-gnu。对于 32 位二进制文件,需要特别注明异常处理模型。可以在 “rust-lang” Github repository 和 stack overflow 找到一个很好的摘要。.cargo/config

[build]

target="i686-pc-windows-gnu"

rustflags = "-C panic=abort"

或者,对于 64 位二进制文件,我们可以选择 x86_64-pc-windows-gnu。如果是这种情况,可以删除 rustflags 选项。build

$ i686-w64-mingw32-g++ -c -o win_cpp_caller.o caller.cpp

$ i686-w64-mingw32-g++ -static win_cpp_caller.o -o win_cpp_caller \

-L./target/i686-pc-windows-gnu/debug/ \

-lmylib \

-ladvapi32 \

-lws2_32 \

-luserenv

如果是 64 位环境,用该使用 x86_64-w64-mingw32-g++,并相应调整 -L 标志。

结论

通过这篇文章,我们希望提供一个简单的工作示例,说明 Rust 和 C / C++ 如何相互操作,这可以作为一个起点。

我们要感谢以下链接资源的贡献者。

资源

这篇文章总结了以下链接中的信息:

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

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

相关文章

转lua解释执行脚本流程

本文转自&#xff1a;http://www.cnblogs.com/zxh1210603696/p/4458473.html #include "lua.hpp"#include <iostream> using namespace std;#pragma comment(lib, "lua5.1.lib")struct lua_guard{lua_State *pL;lua_guard(lua_State *s) :pL(s){}~lu…

about hamout cloudra

http://running.iteye.com/?page3

(转)PowerHA完全手册(一,二,三)

PowerHA完全手册&#xff08;一&#xff09; 原文&#xff1a;http://www.talkwithtrend.com/Article/39889-----PowerHA完全手册&#xff08;一&#xff09; http://www.talkwithtrend.com/Article/40117---PowerHA完全手册&#xff08;二&#xff09; http://www.talkwithtre…

dial up network

dial up network 通过电话线拨号上网的网络系统

事件处理 java_Java事件处理的4种方法

第一种 自身类作为事件监听器import javax.swing.*;import java.awt.*;import java.awt.event.*;/***Java事件处理机制:自身类作为事件监听器*author Winty(wintysgmail.com)*version 2008-12-3*/class ThisClassEvent extends JFrame implements ActionListener{JButton btn;p…

新浪微博推出具有中国特色的“关注但屏蔽”功能

关注一个人&#xff0c;又偷偷屏蔽他&#xff0c;这项功能有人称之“虚伪”&#xff0c;有人称之“贴心”。 请听题&#xff0c;如何礼貌地回答熟人的这个问题&#xff1a;“你为什么取消了微博上对我的关注&#xff1f;”相信这是很多玩微博的人都会遇到的问题&#xff0c;取消…

linux shell 脚本个人规范总结

一、shell 语句格式 linux shell有一套自己的流程控制语句&#xff0c;其中包括条件语句(if)&#xff0c;循环语句(for,while)&#xff0c;选择语句(case)。下面我将通过例子介绍下&#xff0c;各个语句使用方法。 1.1、if语句结构[if/then/elif/else/fi] if 条件测试语句 then…

java循环基础知识_java基础知识—循环结构

1.while 循环语法&#xff1a;while(循环操作){循环操作&#xff1b;}特点:先判断&#xff0c;再执行&#xff1b;2. &#xff1a;用于数字比较 比较的是地址equals: 用于字符串比较 比较的是字符3.do-while语法&#xff1a;do{循环操作&#xff1b;}while(循环条件)&#xff…

android文件读写

public class service { private Context context;//引入上下文对象&#xff0c;要使用其中的方法openFileOutput public service(Context context) { super(); this.context context; } public void save(String filename,String content)throws Exception//抛出异…

接口的声明

C#中咩有多继承&#xff0c;为了解决多继承接口 什么是接口   接口可以理解为对一组方法声明进行统一命名&#xff0c;但是这些方法没有提供任何实现&#xff0c;也就是说&#xff0c;吧一组方法声明在一个接口中 然后继承于该接口的类都需要实现这些接口。 注意&#xff1a;…

C51编程在不同内存空间(data xdata bdata)定义变量的注意事项

1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、data区内最好放局部变量。 因为局部变量的空间是可以覆盖的&#xff08;某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖&#xff09;,可以提高内…

java 类调用情况_java 如何调用类?情况如下

本人目录如下&#xff1a;在surge目录下有一个java文件想创建一个LBChart2DFrameDemo对象&#xff0c;不知道如何创建&#xff1f;。注意&#xff1a;LBChart2DFrameDemo使用了Chart2D.jar包中内容。这个目录ClsChart2D尚未加在...本人目录如下&#xff1a;在surge目录下有一个…

BZOJ1085: [SCOI2005]骑士精神

【传送门&#xff1a;BZOJ1085】 简要题意&#xff1a; 有一个5*5的棋盘&#xff0c;棋盘上有12个白棋子&#xff0c;12个黑棋子&#xff0c;和一个空格&#xff0c;每只棋子只能按照马走日的规则移动&#xff0c;求出最少步数达到以下状态 题解&#xff1a; DFSA* DFS很容易做…

猎豹网校 java_猎豹网校Java 零基础入门 JAVA基础视频教程(精制)

00.NetBeans_下载和安装.mp4 01.Java_语言概述.mp402.Java标识符和关键字.mp403.Java_变量和基本数据类型.mp404.Java_简单数据类型转换和类包装.mp405.Java_算术运算符表达式.mp406.Java_关系运算符和逻辑运算符.mp407.Java_位_赋值_条件运算符.mp408.Java_基本语句和跳转语句…

获取实体表相关信息

ClassMetadata meta session.getSessionFactory().getClassMetadata(clazz);//实体名称String entityName meta.getEntityName();//主键名称String pkName meta.getIdentifierPropertyName();转载于:https://blog.51cto.com/javaworker/736018

软测第二周作业WordCount

一、Github地址: https://github.com/duwei1996/wc 二、PSP2.1表格 PSP2.1 PSP阶段 预估耗时 &#xff08;分钟&#xff09; 实际耗时 &#xff08;分钟&#xff09; Planning 计划 3030 Estimate 估计这个任务需要多少时间 3030 Development 开发 540900 Analysis …

hook java android_Android Hook Java的的一個改進版本

Hook Java的的一個改進版本《注入安卓進程&#xff0c;並Hook java世界的方法》這篇好文相信大家都看這&#xff0c;里面所提到的方法估計大家也都試過。不過里面的所用的方法&#xff0c;我發現有兩個可以改進的地方。改進點一&#xff1a;更簡單地修改java方法為本地方法.../…

VB6转换C#2010函数替换

VB6转换C#2010函数替换 VB6 ---------------->C#2010 1、InStr(strKey, " ")-->strKey.IndexOf(" ") InStr([start, ]string1, string2[, compare]) 返回指定一字符串在另一字符串中最先出现的位置。在字符串string1中&#xff0c;从start开始找stri…

C#读写文本文件

C#中读写文本文件.txt文件既可以用File类也可用StreamReader、StreamWrite类。这两种方法都需要引用using System.IO命名空间。 下面分别给出例子&#xff1a; 1.File类写入文本文件&#xff1a; 1 private void btnTextWrite_Click(object sender, EventArgs e)2 …

java redirect 跨域_如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式...

如何解决跨域重定向携带参数的问题&#xff1f;不使用将参数拼接在重定向url末尾的方式需求&#xff0c;项目A在服务器A上&#xff0c;需要重定向到服务器B上项目B&#xff0c;并且需要携带参数&#xff0c;参数对用户不可见&#xff0c;所以不可以将参数拼接在重定向url后面&a…