使用CXX桥从c++调用Rust



我正在尝试构建一个应用程序,其中c++是主机语言,在Rust中实现的一些函数是从c++调用的。

和所有的应用程序一样,这个应用程序也有一个唯一的主入口点,叫做main()。

由于我是Rust和CXX Bridge的新手,我面临的问题是,我在Google上找到的所有示例代码都在项目的Rust部分实现了这个main()函数,而我希望它在项目的c++部分实现。

为了调试目的和作为一个解决方案,我在c++代码中添加了一个函数cppmain()。然后Rust main()调用cppmain(), cppmain()又调用我要测试的Rust函数:

User launches app --> app entered at Rust main() --> C++ cppmain() --> Rust test function

这可以用于测试,但不是我最终需要的。

我最终想要的是删除Rust main(),作为交换,使cppmain()成为应用程序的正式main()(本质上是通过将其重命名为main()):

User launches app --> app entered at C++ main() --> Rust test function

然而,我并没有成功。CXX桥似乎要修主桥了。如果不是这样,构建失败(使用cargo)。

如果有人知道如何解决这个问题,请告诉我。谢谢你,马里奥

所以这主要是一个构建问题。CXX对于应用程序的入口点是Rust还是c++或其他语言没有任何偏好。你可以在Rust中找到CXX和main()的示例代码,因为这是你可以用Cargo做的所有事情,这是一个Rust构建系统。

如果你想构建一个c++二进制文件,其中包含一些在Rust中实现的函数,那么你需要首先将Rust源代码构建为库,然后将其链接到你的c++二进制文件中。

较大的项目通常会有自己的多语言构建系统(Bazel, GN, Buck等),这将使这更直接,但你可以自己用Cargo或rustc(你的Rust工具链)和c++编译器完成。链接器(叮当声,GCC,即你的c++工具链)。

请参阅https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-crate-type-field了解货物方面的内容。您将需要一个具有staticlibcrate-type的库crate,它将生成一个.a存档文件,然后您可以将该文件链接到一个更大的c++程序中。

最新更新