我正在尝试构建一个应用程序,其中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了解货物方面的内容。您将需要一个具有staticlib
的crate-type
的库crate,它将生成一个.a
存档文件,然后您可以将该文件链接到一个更大的c++程序中。