Rust/C/C++ 混合构建 - Cmake集成Cargo编译动态库

Cmake是一个强大的多语言编译工具,其内置模块提供了强大的扩展能力。

Rust官方的构建工具是Cargo,其提供了依赖下载,上传和编译等多项功能,极大的便利了Rust项目的开发。

目前C++多数用Cmake构建,如果是Rust集成cmake构建c++动态库,可以用Cargo构建脚本集成cmake-rs构建。

如果要调用Cargo构建Rust编译的动态库,并且通过cmake作为构建工具统一调度,目前主流方案是使用Cmake内置的add_custom_target模块调用Cargo构建。

Playground

1、cargo new rust-lib —lib 创建rust 项目,并在Cargo.toml中指定类型为cdylib

/* by 01130.hk - online tools website : 01130.hk/zh/requestmethod.html */
[package]
name = "rust_lib"
version = "0.1.0"
edition = "2021"

[dependencies]

[lib]
crate-type = ["cdylib"]

2、在 src/lib.rs 创建greet_from_rust动态库函数

/* by 01130.hk - online tools website : 01130.hk/zh/requestmethod.html */
#[no_mangle]
pub extern "C" fn greet_from_rust() {
    println!("Hello, greeting!")
}

3、创建call_rust.c,内容如下

extern void greet_from_rust();

int main(void) {
    greet_from_rust();
    return 0;
}

4、编写Cmake构建规则,创建CMakeLists.txt, 其内容如下

cmake_minimum_required(VERSION 3.22)
project(call_rust)

set(ARGS --target-dir ${CMAKE_BINARY_DIR}/target)

if (CMAKE_BUILD_TYPE STREQUAL "Release")
    message(STATUS "[RUST] Detected release build")
    set(build_profile "release")
    set(ARGS ${ARGS} --release)
else()
    message(STATUS "[RUST] Using default debug build")
    set(build_profile "debug")
endif()

add_custom_target(
    cargo_build ALL
    COMMAND 
        ${CMAKE_COMMAND} -E env 
        cargo build ${ARGS}
    DEPENDS src/lib.rs
)

add_executable(call_rust call_rust.c)
add_library(rust_lib SHARED IMPORTED)
set_property(TARGET rust_lib PROPERTY IMPORTED_LOCATION "${CMAKE_BINARY_DIR}/target/${build_profile}/librust_lib.so")
target_link_libraries(call_rust PUBLIC rust_lib)总结

add_custom_target调用Cargo将src/lib.rs 编译成动态库,为了方便将Cargo的构建目录指定在当前项目下。

add_libraryset_property 将生成的动态库绑定到rust_lib 这个target上,最后将动态库rust_lib通过

target_link_libraries 链接到call_rust二进制target上

Cmake构建配置完成,我们可以通过

cmake -DCMAKE_BUILD_TYPE:STRING=Release . cmake -DCMAKE_BUILD_TYPE:STRING=Debug .

这两个命令切换构建选项,这也对应了Cargo构建的—release选项,然后通过

cmake —build . 构建当前项目, 输出

$ cmake  -DCMAKE_BUILD_TYPE:STRING=Release . && cmake --build . && ./call_rust
-- [RUST] Detected release build
-- Configuring done
-- Generating done
-- Build files have been written to: /root/workspace/build-tool-examples/rust_lib
Compiling rust_lib v0.1.0 (/root/workspace/build-tool-examples/rust_lib)
Finished release profile [optimized] target(s) in 0.44s
[  0%] Built target cargo_build
Consolidate compiler generated dependencies of target call_rust
[ 50%] Linking C executable call_rust
[100%] Built target call_rust
Hello, greeting!
error: failed to run custom build command for `proj-sys v0.27.0` note: To improve backtraces for build dependencies, set the CARGO_PROFILE_DEV_BUILD_OVERRIDE_DEBUG=true environment variable to enable debug information generation. Caused by: process didn't exit successfully: `E:\untitled4\proj-rust\target\debug\build\proj-sys-ebcc43bf773a7e8d\build-script-build` (exit code: 101) --- stdout cargo:rerun-if-env-changed=PROJ_NO_PKG_CONFIG cargo:rerun-if-env-changed=PKG_CONFIG_x86_64-pc-windows-msvc cargo:rerun-if-env-changed=PKG_CONFIG_x86_64_pc_windows_msvc cargo:rerun-if-env-changed=HOST_PKG_CONFIG cargo:rerun-if-env-changed=PKG_CONFIG cargo:rerun-if-env-changed=PROJ_STATIC cargo:rerun-if-env-changed=PROJ_DYNAMIC cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64-pc-windows-msvc cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64_pc_windows_msvc cargo:rerun-if-env-changed=HOST_PKG_CONFIG_PATH cargo:rerun-if-env-changed=PKG_CONFIG_PATH cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64-pc-windows-msvc cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64_pc_windows_msvc cargo:rerun-if-env-changed=HOST_PKG_CONFIG_LIBDIR cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-pc-windows-msvc cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_pc_windows_msvc cargo:rerun-if-env-changed=HOST_PKG_CONFIG_SYSROOT_DIR cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR cargo:rustc-cfg=bundled_build CMAKE_TOOLCHAIN_FILE_x86_64-pc-windows-msvc = None CMAKE_TOOLCHAIN_FILE_x86_64_pc_windows_msvc = None HOST_CMAKE_TOOLCHAIN_FILE = None CMAKE_TOOLCHAIN_FILE = None CMAKE_GENERATOR_x86_64-pc-windows-msvc = None CMAKE_GENERATOR_x86_64_pc_windows_msvc = None HOST_CMAKE_GENERATOR = None CMAKE_GENERATOR = None CMAKE_PREFIX_PATH_x86_64-pc-windows-msvc = None CMAKE_PREFIX_PATH_x86_64_pc_windows_msvc = None HOST_CMAKE_PREFIX_PATH = None CMAKE_PREFIX_PATH = None CMAKE_x86_64-pc-windows-msvc = None CMAKE_x86_64_pc_windows_msvc = None HOST_CMAKE = None CMAKE = None running: "cmake" "E:\\untitled4\\proj-rust\\target\\debug\\build\\proj-sys-5e690173b1e55b77\\out\\PROJSRC/proj/proj-9.6.2" "-G" "Visual Studio 17 2022" "-Thost=x64" "-Ax64" "-DBUILD_SHARED_LIBS=OFF" "-DBUILD_TESTING=OFF" "-DBUILD_CCT=OFF" "-DBUILD_CS2CS=OFF" "-DBUILD_GEOD=OFF" "-DBUILD_GIE=OFF" "-DBUILD_PROJ=OFF" "-DBUILD_PROJINFO=OFF" "-DBUILD_PROJSYNC=OFF" "-DENABLE_CURL=OFF" "-DENABLE_TIFF=OFF" "-DCMAKE_INSTALL_PREFIX=E:\\untitled4\\proj-rust\\target\\debug\\build\\proj-sys-5e690173b1e55b77\\out" "-DCMAKE_C_FLAGS= -nologo -MD -Brepro" "-DCMAKE_C_FLAGS_RELEASE= -nologo -MD -Brepro" "-DCMAKE_CXX_FLAGS= -nologo -MD -Brepro" "-DCMAKE_CXX_FLAGS_RELEASE= -nologo -MD -Brepro" "-DCMAKE_ASM_FLAGS= -nologo -MD -Brepro" "-DCMAKE_ASM_FLAGS_RELEASE= -nologo -MD -Brepro" "-DCMAKE_BUILD_TYPE=Release" -- Requiring C++17 -- Requiring C++17 - done -- Requiring C99 -- Requiring C99 - done -- Configuring PROJ: -- PROJ_VERSION = 9.6.2 -- nlohmann/json: internal -- Configuring incomplete, errors occurred! --- stderr pkg-config unable to find existing libproj installation: pkg-config exited with status code 1 > PKG_CONFIG_PATH=C:\OSGeo4W64\lib\pkgconfig PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --libs --cflags proj 'proj >= 9.6.2' The system library `proj` required by crate `proj-sys` was not found. The file `proj.pc` needs to be installed and the PKG_CONFIG_PATH environment variable must contain its parent directory. PKG_CONFIG_PATH contains the following: - C - \OSGeo4W64\lib\pkgconfig HINT: you may need to install a package such as proj, proj-dev or proj-devel. disabling tiff support CMake Error at CMakeLists.txt:211 (message): sqlite3 binary not found! CMake Error at E:/Rustrover/CMake/share/cmake-4.1/Modules/FindPackageHandleStandardArgs.cmake:227 (message): Could NOT find SQLite3 (missing: SQLite3_LIBRARY SQLite3_INCLUDE_DIR) Call Stack (most recent call first): E:/Rustrover/CMake/share/cmake-4.1/Modules/FindPackageHandleStandardArgs.cmake:591 (_FPHSA_FAILURE_MESSAGE) E:/Rustrover/CMake/share/cmake-4.1/Modules/FindSQLite3.cmake:82 (find_package_handle_standard_args) CMakeLists.txt:224 (find_package) thread 'main' panicked at C:\Users\发光美西螈\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\cmake-0.1.54\src\lib.rs:1119:5: command did not execute successfully, got: exit code: 1 build script failed, must exit now stack backtrace: 0: std::panicking::begin_panic_handler at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library\std\src\panicking.rs:697 1: core::panicking::panic_fmt at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library\core\src\panicking.rs:75 2: cmake::find_exe::{{closure}} 3: <cmake::Version as core::default::Default>::default 4: cmake::Config::build 5: build_script_build::main::{{closure}} 6: build_script_build::main::{{closure}} 7: core::result::Result<T,E>::or_else 8: build_script_build::main 9: core::ops::function::FnOnce::call_once 10: std::ffi::os_str::OsString::new 11: std::rt::lang_start::{{closure}} 12: std::rt::lang_start_internal::closure$0 at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library\std\src\rt.rs:175 13: std::panicking::catch_unwind::do_call at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library\std\src\panicking.rs:589 14: std::panicking::catch_unwind at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library\std\src\panicking.rs:552 15: std::panic::catch_unwind at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library\std\src\panic.rs:359 16: std::rt::lang_start_internal at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library\std\src\rt.rs:171 17: std::rt::lang_start 18: main 19: invoke_main at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78 20: __scrt_common_main_seh at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288 21: BaseThreadInitThunk 22: RtlUserThreadStart note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
09-24
内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础和Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集和参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值