You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:34:28