82端口做網(wǎng)站品牌傳播策劃方案
問題描述
我有一個使用 CMake 構(gòu)建的現(xiàn)有 C++/Qt 項目,我想開始添加 Rust 代碼,并能夠從主 C++ 代碼庫中調(diào)用這些 Rust 代碼。應(yīng)該如何組織項目結(jié)構(gòu)?
現(xiàn)有項目結(jié)構(gòu)
./CMakeLists.txt
./subproject-foo/CMakeLists.txt
./subproject-foo/src/...
./subproject-bar/CMakeLists.txt
./subproject-bar/src/...
./common/CMakeLists.txt
./common/src/...
我想添加一個類似結(jié)構(gòu)的 common-rust/
目錄。
解決方案
為了在 CMake 項目中集成 Rust 代碼,可以使用 ExternalProject
模塊,它可以用于構(gòu)建不使用 CMake 的外部依賴項。
Rust 項目設(shè)置
假設(shè)你有一個 common-rust
子目錄,其 Cargo.toml
文件如下:
[package]
name = "rust_example"
version = "0.1.0"[lib]
name = "rust_example"
crate-type = ["staticlib"]
并且在 lib.rs
文件中定義一個函數(shù) add
:
#[no_mangle]
pub extern fn add(lhs: u32, rhs: u32) -> u32 {lhs + rhs
}
CMake 項目設(shè)置
在頂層的 CMakeLists.txt
文件中,可以這樣配置:
add_executable(Example cpp/main.cpp)# 啟用 ExternalProject CMake 模塊
include(ExternalProject)# 設(shè)置 ExternalProject 的根目錄
set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/Rust)# 將 rust_example 添加為 CMake 目標
ExternalProject_Add(rust_exampleDOWNLOAD_COMMAND ""CONFIGURE_COMMAND ""BUILD_COMMAND cargo build --releaseBINARY_DIR "${CMAKE_SOURCE_DIR}/common-rust"INSTALL_COMMAND ""LOG_BUILD ON)# 創(chuàng)建 Example 對 rust_example 的依賴關(guān)系
add_dependencies(Example rust_example)# 指定 Example 的鏈接庫
target_link_libraries(Exampledebug "${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)
請注意,這里依賴于 Cargo 在路徑中可用。
示例 C++ 代碼
cpp/main.cpp
文件內(nèi)容如下:
#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;
}
平臺依賴
對于非 Windows 平臺,需要修改鏈接的系統(tǒng)庫。例如,在 macOS 上需要鏈接 m
, c
, System
, resolv
庫。
另一種方案
可以使用 Corrosion 項目,它簡化了 CMake 與 Cargo 項目的集成。在 CMakeLists.txt
文件中添加以下內(nèi)容:
find_package(Corrosion REQUIRED)
corrosion_import_crate(MANIFEST_PATH ${CMAKE_SOURCE_DIR}/common-rust)
參考資料
- 使用 ExternalProject 構(gòu)建外部項目
- Corrosion 項目 GitHub 頁面
這樣配置之后,您應(yīng)該可以成功將 Rust 代碼集成到現(xiàn)有的 C++/Qt/CMake 項目中。