您可以为此使用ExternalProject module。它旨在允许构建外部依赖项——即使是不使用 CMake 的依赖项。这是一个useful article 使用它。
假设你有你的“common-rust”子目录,它的 Cargo.toml 包含:
[package]
name = "rust_example"
version = "0.1.0"
[lib]
name = "rust_example"
crate-type = ["staticlib"]
它通过其 lib.rs 公开了一个函数 add:
#[no_mangle]
pub extern fn add(lhs: u32, rhs: u32) -> u32 {
lhs + rhs
}
那么您的顶级 CMakeLists.txt 可能如下所示:
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_32、userenv 和 advapi32。这显然不是跨平台的,但您可以轻松地处理它(例如,在if..else 块内将变量设置为适合每个平台的依赖项列表,并将其附加到target_link_libraries 调用中)。
另请注意,这取决于路径中是否存在 Cargo。
你现在应该可以走了。文件“cpp/main.cpp”可能包含以下内容:
#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 的链接。