badicsalex / ar-drivers-rs

Opensource Rust driver for various AR glasses
MIT License
132 stars 21 forks source link

Error when integrating Rust code with C++ using Corrosion #8

Closed ostinellidario closed 11 months ago

ostinellidario commented 11 months ago

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 the format! 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":

/usr/bin/ld: librust_lib.a(hid.o): in function `copy_udev_string':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:187: undefined reference to `udev_device_get_sysattr_value'
/usr/bin/ld: librust_lib.a(hid.o): in function `create_device_info_for_device':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:592: undefined reference to `udev_device_get_syspath'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:593: undefined reference to `udev_device_get_devnode'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:595: undefined reference to `udev_device_get_parent_with_subsystem_devtype'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:605: undefined reference to `udev_device_get_sysattr_value'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:662: undefined reference to `udev_device_get_parent_with_subsystem_devtype'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:682: undefined reference to `udev_device_get_sysattr_value'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:686: undefined reference to `udev_device_get_parent_with_subsystem_devtype'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:691: undefined reference to `udev_device_get_sysattr_value'
/usr/bin/ld: librust_lib.a(hid.o): in function `create_device_info_for_hid_device':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:793: undefined reference to `udev_new'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:800: undefined reference to `udev_device_new_from_devnum'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:810: undefined reference to `udev_device_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:811: undefined reference to `udev_unref'
/usr/bin/ld: librust_lib.a(hid.o): in function `hid_enumerate':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:862: undefined reference to `udev_new'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:869: undefined reference to `udev_enumerate_new'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:870: undefined reference to `udev_enumerate_add_match_subsystem'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:871: undefined reference to `udev_enumerate_scan_devices'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:872: undefined reference to `udev_enumerate_get_list_entry'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:885: undefined reference to `udev_list_entry_get_name'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:899: undefined reference to `udev_device_new_from_syspath'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:919: undefined reference to `udev_device_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:875: undefined reference to `udev_list_entry_get_next'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:922: undefined reference to `udev_enumerate_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/hidapi-2.4.1/etc/hidapi/linux/hid.c:923: undefined reference to `udev_unref'
/usr/bin/ld: librust_lib.a(serialport-a53cc5783c26bbda.serialport.19bcbf8f7a8625d1-cgu.0.rcgu.o): in function `libudev::enumerator::Enumerator::match_subsystem':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:56: undefined reference to `udev_enumerate_add_match_subsystem'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `<libudev::context::Context as core::clone::Clone>::clone':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/context.rs:26: undefined reference to `udev_ref'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `<libudev::context::Context as core::ops::drop::Drop>::drop':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/context.rs:35: undefined reference to `udev_unref'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::context::Context::new':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/context.rs:51: undefined reference to `udev_new'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::from_raw':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:15: undefined reference to `udev_device_get_udev'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:15: undefined reference to `udev_ref'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `<libudev::device::Device as core::ops::drop::Drop>::drop':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:29: undefined reference to `udev_device_get_udev'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:31: undefined reference to `udev_device_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:32: undefined reference to `udev_unref'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::from_syspath':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:54: undefined reference to `udev_device_new_from_syspath'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::is_initialized':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:69: undefined reference to `udev_device_get_is_initialized'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::devnum':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:75: undefined reference to `udev_device_get_devnum'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::syspath':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:88: undefined reference to `udev_device_get_syspath'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::devpath':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:98: undefined reference to `udev_device_get_devpath'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::devnode':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:108: undefined reference to `udev_device_get_devnode'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::parent':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:114: undefined reference to `udev_device_get_parent'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:118: undefined reference to `udev_device_ref'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::subsystem':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:134: undefined reference to `udev_device_get_subsystem'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::sysname':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:145: undefined reference to `udev_device_get_sysname'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::sysnum':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:158: undefined reference to `udev_device_get_sysnum'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::devtype':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:173: undefined reference to `udev_device_get_devtype'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::driver':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:178: undefined reference to `udev_device_get_driver'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::property_value':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:186: undefined reference to `udev_device_get_property_value'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::attribute_value':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:199: undefined reference to `udev_device_get_sysattr_value'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::properties':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:233: undefined reference to `udev_device_get_properties_list_entry'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::device::Device::attributes':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:254: undefined reference to `udev_device_get_sysattr_list_entry'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `<libudev::device::Properties as core::iter::traits::iterator::Iterator>::next':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:272: undefined reference to `udev_list_entry_get_name'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:273: undefined reference to `udev_list_entry_get_value'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:275: undefined reference to `udev_list_entry_get_next'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `<libudev::device::Attributes as core::iter::traits::iterator::Iterator>::next':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:323: undefined reference to `udev_list_entry_get_name'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/device.rs:325: undefined reference to `udev_list_entry_get_next'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `<libudev::enumerator::Enumerator as core::ops::drop::Drop>::drop':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:22: undefined reference to `udev_enumerate_get_udev'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:24: undefined reference to `udev_enumerate_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:25: undefined reference to `udev_unref'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::enumerator::Enumerator::new':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:35: undefined reference to `udev_enumerate_new'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:38: undefined reference to `udev_ref'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::enumerator::Enumerator::match_is_initialized':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:47: undefined reference to `udev_enumerate_add_match_is_initialized'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::enumerator::Enumerator::match_parent':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:101: undefined reference to `udev_enumerate_add_match_parent'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::enumerator::Enumerator::add_syspath':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:129: undefined reference to `udev_enumerate_add_syspath'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::enumerator::Enumerator::scan_devices':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:138: undefined reference to `udev_enumerate_scan_devices'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:144: undefined reference to `udev_enumerate_get_udev'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:145: undefined reference to `udev_enumerate_get_list_entry'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `<libudev::enumerator::Devices as core::iter::traits::iterator::Iterator>::next':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:165: undefined reference to `udev_list_entry_get_name'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:167: undefined reference to `udev_list_entry_get_next'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/enumerator.rs:169: undefined reference to `udev_device_new_from_syspath'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `<libudev::monitor::Monitor as core::ops::drop::Drop>::drop':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:25: undefined reference to `udev_monitor_get_udev'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:27: undefined reference to `udev_monitor_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:28: undefined reference to `udev_unref'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::monitor::Monitor::new':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:38: undefined reference to `udev_monitor_new_from_netlink'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:41: undefined reference to `udev_ref'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::monitor::Monitor::clear_filters':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:78: undefined reference to `udev_monitor_filter_remove'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::monitor::Monitor::listen':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:87: undefined reference to `udev_monitor_enable_receiving'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `<libudev::monitor::MonitorSocket as std::os::fd::raw::AsRawFd>::as_raw_fd':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:112: undefined reference to `udev_monitor_get_fd'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::monitor::MonitorSocket::receive_event':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:123: undefined reference to `udev_monitor_receive_device'
/usr/bin/ld: librust_lib.a(libudev-dcc135525207f98d.libudev.b8a15c9b902ba02f-cgu.0.rcgu.o): in function `libudev::monitor::Event::sequence_number':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libudev-0.3.0/src/monitor.rs:204: undefined reference to `udev_device_get_seqnum'
/usr/bin/ld: librust_lib.a(linux_udev.o): in function `linux_udev_start_event_monitor':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:49: undefined reference to `udev_new'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:55: undefined reference to `udev_monitor_new_from_netlink'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:61: undefined reference to `udev_monitor_filter_add_match_subsystem_devtype'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:67: undefined reference to `udev_monitor_enable_receiving'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:72: undefined reference to `udev_monitor_get_fd'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:121: undefined reference to `udev_monitor_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:125: undefined reference to `udev_unref'
/usr/bin/ld: librust_lib.a(linux_udev.o): in function `linux_udev_stop_event_monitor':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:150: undefined reference to `udev_monitor_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:155: undefined reference to `udev_unref'
/usr/bin/ld: librust_lib.a(linux_udev.o): in function `linux_udev_event_thread_main':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:197: undefined reference to `udev_monitor_receive_device'
/usr/bin/ld: librust_lib.a(linux_udev.o): in function `udev_device_info':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:214: undefined reference to `udev_device_get_devnode'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:219: undefined reference to `udev_device_get_sysname'
/usr/bin/ld: librust_lib.a(linux_udev.o): in function `udev_hotplug_event':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:237: undefined reference to `udev_device_get_action'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:262: undefined reference to `udev_device_unref'
/usr/bin/ld: librust_lib.a(linux_udev.o): in function `linux_udev_scan_devices':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:275: undefined reference to `udev_enumerate_new'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:281: undefined reference to `udev_enumerate_add_match_subsystem'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:282: undefined reference to `udev_enumerate_add_match_property'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:283: undefined reference to `udev_enumerate_scan_devices'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:284: undefined reference to `udev_enumerate_get_list_entry'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:288: undefined reference to `udev_list_entry_get_name'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:291: undefined reference to `udev_device_new_from_syspath'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:295: undefined reference to `udev_device_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:300: undefined reference to `udev_device_unref'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:287: undefined reference to `udev_list_entry_get_next'
/usr/bin/ld: /home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:303: undefined reference to `udev_enumerate_unref'
/usr/bin/ld: librust_lib.a(linux_udev.o): in function `linux_udev_hotplug_poll':
/home/dario/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libusb1-sys-0.6.4/libusb/libusb/os/linux_udev.c:314: undefined reference to `udev_monitor_receive_device'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/test-imu-rokid.dir/build.make:98: test-imu-rokid] Error 1
make[1]: *** [CMakeFiles/Makefile2:1019: CMakeFiles/test-imu-rokid.dir/all] Error 2
make: *** [Makefile:121: all] Error 2
badicsalex commented 11 months ago

To me it looks like you just need to link libudev manually in your CMakeLists.

badicsalex commented 11 months ago

Did you manage to fix the issue?

ostinellidario commented 11 months ago

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.

badicsalex commented 11 months ago

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.

ostinellidario commented 11 months ago

The setup I'm using is the following:

  1. A Rust library (test-lib) created with the standard cargo command, to which I added as a dependency the package ar-drivers
  2. A CMake project (test-corrosion) with a simple main.cpp file and a simple rust file lib.rs

test-lib

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.

test-corrosion

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.

badicsalex commented 11 months ago

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.