首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用C++/Qt/CMake项目构建Rust代码?

如何使用C++/Qt/CMake项目构建Rust代码?
EN

Stack Overflow用户
提问于 2015-07-01 21:15:06
回答 2查看 8K关注 0票数 46

我有一个用CMake构建的C++/Qt project。我想开始添加Rust代码,我可以从主C++代码库中调用这些代码。

构建项目的正确方式是什么?

当前项目结构:

代码语言:javascript
复制
./CMakeLists.txt
./subproject-foo/CMakeLists.txt
./subproject-foo/src/...
./subproject-bar/CmakeLists.txt
./subproject-bar/src/...
./common/CMakeLists.txt
./common/src/...

我想添加一个具有类似结构的common-rust/...目录。

我怎样才能把这个整合到项目中呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-02 11:54:24

为此,您可以使用ExternalProject module。它被设计为允许构建外部依赖-即使是那些不使用CMake的依赖。这里有一个关于使用它的useful article

假设您有一个"common-rust“子目录,它的Cargo.toml包含:

代码语言:javascript
复制
[package]
name = "rust_example"
version = "0.1.0"

[lib]
name = "rust_example"
crate-type = ["staticlib"]

并且它通过其lib.rs公开了一个函数add

代码语言:javascript
复制
#[no_mangle]
pub extern fn add(lhs: u32, rhs: u32) -> u32 {
    lhs + rhs
}

那么您的顶级CMakeLists.txt可能如下所示:

代码语言:javascript
复制
add_executable(Example cpp/main.cpp)

# Enable ExternalProject CMake module
include(ExternalProject)

# Set default ExternalProject root directory
set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/Rust)

# Add rust_example as a CMake target
ExternalProject_Add(
    rust_example
    DOWNLOAD_COMMAND ""
    CONFIGURE_COMMAND ""
    BUILD_COMMAND cargo build COMMAND cargo build --release
    BINARY_DIR "${CMAKE_SOURCE_DIR}/common-rust"
    INSTALL_COMMAND ""
    LOG_BUILD ON)

# Create dependency of Example on rust_example
add_dependencies(Example rust_example)

# Specify Example's link libraries
target_link_libraries(Example
    debug "${CMAKE_SOURCE_DIR}/common-rust/target/debug/librust_example.a"
    optimized "${CMAKE_SOURCE_DIR}/common-rust/target/release/librust_example.a"
    ws2_32 userenv advapi32)

set_target_properties(Example PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON)

当您将Rust目标构建为staticlib时,它会输出应该链接哪些其他库。我只在Windows上尝试过,因此ws2_32userenvadvapi32是链接的。这显然不是跨平台的,但你可以很容易地处理这一点(例如,在if..else块中为适合每个平台的依赖项列表设置一个变量,并将其附加到target_link_libraries调用中)。

还要注意,这取决于路径中的货物是否可用。

你现在应该可以走了。文件"cpp/main.cpp“可能包含如下内容:

代码语言:javascript
复制
#include <cstdint>
#include <iostream>

extern "C" {
  uint32_t add(uint32_t lhs, uint32_t rhs);
}

int main() {
  std::cout << "1300 + 14 == " << add(1300, 14) << '\n';
  return 0;
}

这里有一个指向工作example project的链接。

票数 67
EN

Stack Overflow用户

发布于 2022-01-19 08:47:08

现在有一个可用于构建的项目: Corrosion https://github.com/corrosion-rs/corrosion

所以你的CMakeLists.txt只会有这个:

代码语言:javascript
复制
# See the Corrosion README to find more ways to get Corrosion
find_package(Corrosion REQUIRED)

corrosion_import_crate(MANIFEST_PATH ${CMAKE_SOURCE_DIR}/common-rust)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31162438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档