Closed ostinellidario closed 11 months ago
To me it looks like you just need to link libudev
manually in your CMakeLists.
Did you manage to fix the issue?
No, I've not been able to fix the issue. I tried to manually link the library both using the CMake command target_link_libraries
nor the custom Corrosion command corrosion_link_libraries
.
I was unable to reproduce this issue. Can you please share a (minimal) reproduction? Or maybe a verbose build log, I wonder what the linker parameters are.
The setup I'm using is the following:
ar-drivers
lib.rs
The Cargo.toml file is:
[package]
name = "test-lib"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
ar-drivers = {path = "<local path to the module>/ar-drivers-rs"}
The src/lib.rs file is:
use ar_drivers::any_glasses;
pub fn add(left: usize, right: usize) -> usize {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
let s = format!("{}", result);
assert_eq!(result, 4);
}
}
Note that I don't actually use the code from ar_drivers anywhere, I just include it with use
.
The structure of the project is the following:
test-corrosion
|_build
|_rust
| |_src
| |_ lib.rs
| |_Cargo.toml
|_CMakeLists.txt
|_main.cpp
In the main.cpp file:
#include <iostream>
extern "C" {
void rust_function(char const *name);
}
int main(int argc, char **argv) {
if (argc < 2) {
rust_function("Cpp");
} else {
rust_function(argv[1]);
}
}
In the Cargo.toml
[package]
name = "rust-lib"
version = "0.1.0"
edition = "2021"
[dependencies]
test-lib = {path = "<local path to the module>/test-lib"}
[lib]
crate-type=["staticlib"]
In the lib.rs file
use std::os::raw::c_char;
use test_lib::add;
#[no_mangle]
pub extern "C" fn rust_function(name: *const c_char) {
let name = unsafe { std::ffi::CStr::from_ptr(name).to_str().unwrap() };
println!("Hello, {}! I'm Rust! {}", name, format!("{}", add(10, 5)));
}
Then I build and compile using the following CMakeLists.txt file
cmake_minimum_required(VERSION 3.0.0)
project(test-corrosion VERSION 0.1.0 LANGUAGES C CXX)
include(CTest)
enable_testing()
#add_executable(test-corrosion main.cpp)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
#Install Corrosion for Rust integration
include(FetchContent)
FetchContent_Declare(
Corrosion
GIT_REPOSITORY https://github.com/corrosion-rs/corrosion.git
GIT_TAG v0.4 # Optionally specify a commit hash, version tag or branch here
)
# Set any global configuration variables such as `Rust_TOOLCHAIN` before this line!
FetchContent_MakeAvailable(Corrosion)
#Import Rust crate
corrosion_import_crate(
MANIFEST_PATH rust/Cargo.toml #Defines a Rust library crate called "rust-lib"
ALL_FEATURES
)
#Link Rust and setup cpp executable
add_executable(test-corrosion main.cpp)
target_link_libraries(test-corrosion PUBLIC rust-lib)
Note that if I comment the use ar_drivers::any_glasses;
statement, everyting compiles and executes correctly.
The error I reported in the original comment shows up only if the use
statement is uncommented.
It works for me if I add libudev
and libusb
to target_link_libraries:
target_link_libraries(test-corrosion PUBLIC rust-lib udev usb-1.0)
In fact, if I don't do the transitive lib thing, but just do this directly with rusb
, I also get the issue, which means it's not ar-drivers-rs-specific:
lib.rs:
use std::os::raw::c_char;
#[no_mangle]
pub extern "C" fn rust_function(name: *const c_char) {
println!("{:?}", rusb::devices().unwrap().iter().collect::<Vec<_>>());
}
Cargo.toml:
[package]
name = "rust-lib"
version = "0.1.0"
edition = "2021"
[dependencies]
rusb = "0.9.3"
[lib]
crate-type=["staticlib"]
I wonder why corrosion
doesn't detect these dependencies, you may want to ask in their github if this is by design or not.
I was trying to integrate Rust code into a C++ project using the Corrosion tool. This was necessary because I needed to build the project using CMake. Despite being able to integrate Rust code and also including external dependencies, when I add the "ar-drivers" package as a dependency, I get a compilation error when using any function that manipulates objects of type
std::string
.This happens even when "ar-drivers" is included as a transitive dependency. If I include code from "ar-drivers" in a library called "my-lib" and then add it as a dependency to the project built with Corrosion, I still get the same error. This problem doesn't occur if I simply include the code of "ar-drivers"; I must include the code and also use any function that involves or returns
std::string
, such as theformat!
macro. The error seems to depend on the fact that the compiler can't find a library that was previously working correctly and was being found. The compilation doesn't show any errors in the code I wrote. The entire error trace doesn't point to a specific location in the code where the error is generated but only shows errors related to "not found definitions":