使用cmake Rust crate构建项目时,C++共享库及头文件无法安装到/usr/local/{include,lib}路径的问题求助
使用cmake Rust crate构建项目时,C++共享库及头文件无法安装到/usr/local/{include,lib}路径的问题求助
大家好,我最近在做一个混合Rust和C++的项目,遇到了安装路径的问题,想请教一下各位。
我的项目里,Rust二进制程序rust-bin需要链接到C共享库子项目cpp-lib,我用了rust的cmake crate作为构建依赖。目前整个项目编译构建都能正常完成,但有个问题:C共享库没有被安装到/usr/local/lib,头文件也没到/usr/local/include,它们都只被安装在了cpp-lib子项目的本地路径里,这不符合我的预期。
下面是我的项目结构、各文件内容以及执行的构建步骤:
项目层级
. ├── CMakeLists.txt ├── Cargo.toml └── rust-bin ├── Cargo.toml ├── build.rs ├── cpp-lib │ ├── CMakeLists.txt │ ├── inc │ │ └── lib.hpp │ └── src │ └── lib.cpp └── src └── main.rs
根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.22) project(cmake-demo) set(CMAKE_BUILD_TYPE "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Building in Debug mode") add_compile_definitions(DEBUG=1) else() message(STATUS "Building in Release mode") add_compile_definitions(NDEBUG=1) endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH "${ORIGIN}") set(VERSION "1.1.1") string(REPLACE "." ";" ver_list ${VERSION}) list(GET ver_list 0 LIB_MAJOR) list(GET ver_list 1 LIB_MINOR) include(GNUInstallDirs) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(CARGO_BUILD_FLAGS ) set(RUST_BUILD_TYPE "debug") else() set(CARGO_BUILD_FLAGS --release) set(RUST_BUILD_TYPE "release") endif() add_custom_target( build-bin ALL COMMAND cargo build --package rust-bin ${CARGO_BUILD_FLAGS} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Building Rust project with Cargo..." ) install( PROGRAMS "${PROJECT_SOURCE_DIR}/target/${RUST_BUILD_TYPE}/rust-bin" TYPE BIN ) set_target_properties( build-bin PROPERTIES ADDITIONAL_CLEAN_FILES "${PROJECT_SOURCE_DIR}/target" )
根目录Cargo.toml
[workspace] resolver = "3" members = ["rust-bin"] [workspace.package] version = "1.1.1" edition = "2024" publish = false [profile.optimized-release] inherits = "release" lto = true strip = true [profile.yocto-release] inherits = "release" lto = true
rust-bin/Cargo.toml
[package] name = "rust-bin" version.workspace = true edition.workspace = true publish.workspace = true [dependencies] [build-dependencies] cmake = "0.1.57"
rust-bin/build.rs
use std::env; use cmake::Config; fn main() { let manifest = env!("CARGO_MANIFEST_DIR"); let cpp_lib_path = format!("{manifest}/cpp-lib"); let out_dir = format!("{manifest}/cpp-lib"); let dst = Config::new(cpp_lib_path) .pic(true) .out_dir(out_dir.clone()) .build(); println!("{}", dst.display()); println!("cargo:rustc-link-search=native={out_dir}/lib"); println!("cargo::rustc-link-arg=-Wl,-rpath='$$ORIGIN/../lib'"); println!("cargo::rustc-link-lib=sup_lib"); }
rust-bin/src/main.rs
fn main() { println!("Hello, world!"); }
rust-bin/cpp-lib/CMakeLists.txt
cmake_minimum_required(VERSION 3.22) project(cmake-cpp-lib) set(CMAKE_BUILD_TYPE "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Building in Debug mode") add_compile_definitions(DEBUG=1) else() message(STATUS "Building in Release mode") add_compile_definitions(NDEBUG=1) endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH "${ORIGIN}") set(VERSION "1.1.1") string(REPLACE "." ";" ver_list ${VERSION}) list(GET ver_list 0 LIB_MAJOR) list(GET ver_list 1 LIB_MINOR) # Shared vs Static (LIB_TYPE) option(BUILD_SHARED_LIBS "Build shared libraries" ON) include(GNUInstallDirs) set(TARGET_NAME sup_lib) set(TARGET_ALIAS_NAME sup-lib) set(SRC src/lib.cpp ) add_library(${TARGET_NAME} ${SRC}) add_library(${PROJECT_NAME}::${TARGET_ALIAS_NAME} ALIAS ${TARGET_NAME}) set_target_properties( ${TARGET_NAME} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_RPATH}" ) target_include_directories( ${TARGET_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> ) set_target_properties( ${TARGET_NAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME} VERSION "${VERSION}" SOVERSION "${LIB_MAJOR}.${LIB_MINOR}" ) install( TARGETS ${TARGET_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/inc" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}-${TARGET_ALIAS_NAME}" FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" )
rust-bin/cpp-lib/src/lib.cpp
#include "lib.hpp" int add(int a, int b) { return a + b; }
rust-bin/cpp-lib/inc/lib.hpp
int add(int a, int b);
我执行的构建步骤(从根项目目录开始)
mkdir build cd build cmake .. make
麻烦各位帮我看看问题出在哪,怎么才能让C++的库和头文件安装到系统的/usr/local/lib和/usr/local/include路径里呢?
备注:内容来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

