В моем проекте двоичный файл Rustrust-bin должен быть связан с подпроектом общей библиотеки C++ cpp-lib, для которого я использую cmakerus crate в качестве зависимости сборки. Весь проект собирается нормально, но общая библиотека C++ не устанавливается в /usr/local/lib, а также файлы заголовков библиотеки не устанавливаются в /usr/local/include, вместо этого они устанавливаются в путь cpp-lib подпроекта C++.
Иерархия проекта
.
├── 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
$
$
)
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
Подробнее здесь: https://stackoverflow.com/questions/799 ... ocal-inclu
Cmake Rust Crate не устанавливает файлы заголовков и библиотеки по путям /usr/local/{include, lib} ⇐ C++
Программы на C++. Форум разработчиков
1773078404
Anonymous
В моем проекте двоичный файл Rustrust-bin должен быть связан с подпроектом общей библиотеки C++ cpp-lib, для которого я использую cmakerus crate в качестве зависимости сборки. Весь проект собирается нормально, но общая библиотека C++ не устанавливается в /usr/local/lib, а также файлы заголовков библиотеки не устанавливаются в /usr/local/include, вместо этого они устанавливаются в путь cpp-lib подпроекта C++.
Иерархия проекта
.
├── 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
$
$
)
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79904019/cmake-rust-crate-doesnt-install-header-files-and-libraries-to-usr-local-inclu[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия