所以我正在为一个C++库编写一个Rust FFI,它有一个带有C风格函数头的extern"C"块.我的低级FFI构建.
但是,当我在另一个项目中使用我的FFI时,它没有正确链接,我得到运算符new(),delete()等的未定义引用.
我的问题是:
我搞砸了,因为这是C++,你不能将Rust链接到C++吗?
使用FFI库的应用程序是否应该以某种方式处理链接问题,如果是这样,如何处理?
我的libsomething.a可以以某种方式构建,以包含这些C++组件,如果是这样,如何?我目前正在使用gcc包装箱.
把你自己的解决方案放在这
我正在使用一个新的init系统#![no_std]和extern crate rlibcasm进行系统调用,并且当前也试图不分配内存.因此,我所拥有的可能工具的范围是有限的.
我需要调用execve系统调用,它需要a char** argv和a char **envp.我可以将c风格的字符串作为零的字节数组合在一起,但是我怎么能无效地终止静态声明的这样的列表(最后一个指针是NULL)?
我试图封装一些代码以避免重复它,涉及从Mutex中借用数据以及进一步的操作(我将这个问题留在了范围之外,但却是激励因素).
以下示例代码抱怨说guard活动时间不够长.但这正是为什么我要回归guard为此目的明确设计的结构.
这是借入检查员的限制吗?关于解决这个问题的任何建议?
use std::sync::{Mutex,MutexGuard};
use std::ops::DerefMut;
pub struct InnerData {
count: i32 // sample only
}
pub struct Data {
pub inner_data: Mutex<InnerData>
}
pub struct BorrowedInnerData<'a> {
pub inner_data: &'a mut InnerData,
guard: MutexGuard<'a,InnerData>,
}
impl Data {
pub fn borrow_inner_data<'a>(&'a mut self) -> BorrowedInnerData<'a> {
let guard = self.inner_data.lock().unwrap();
BorrowedInnerData {
inner_data: guard.deref_mut(),
guard: guard,
}
}
}
fn main() {
let mut data = Data {
inner_data: Mutex::new( InnerData {
count: 5 …Run Code Online (Sandbox Code Playgroud)