From 2a691aa66f33f12d998725bbbe57999493543386 Mon Sep 17 00:00:00 2001 From: Damocles Date: Sun, 3 May 2026 19:55:10 +0200 Subject: [PATCH] plugin: export Qt plugin entry symbols from cdylib via --export-dynamic --- plugin/build.rs | 7 +++++++ plugin/src/lib.rs | 12 ------------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/plugin/build.rs b/plugin/build.rs index 117d998..8b3b99e 100644 --- a/plugin/build.rs +++ b/plugin/build.rs @@ -1,6 +1,13 @@ use cxx_qt_build::{CxxQtBuilder, PluginType, QmlModule}; fn main() { + // Rust cdylib uses a version script that hides everything not declared + // `#[no_mangle] pub extern "C"`. cxx-qt's QQmlEngineExtensionPlugin entry + // points (qt_plugin_instance, qt_plugin_query_metadata_v2) come from + // compiled C++ and would otherwise be stripped to local visibility, so Qt's + // plugin loader finds nothing exported. --export-dynamic re-exposes them. + println!("cargo:rustc-link-arg=-Wl,--export-dynamic"); + CxxQtBuilder::new_qml_module(QmlModule::new("NovaStats").plugin_type(PluginType::Dynamic)) .files(["src/system_stats.rs", "src/cpu_service.rs"]) .build(); diff --git a/plugin/src/lib.rs b/plugin/src/lib.rs index 1859504..6c837e5 100644 --- a/plugin/src/lib.rs +++ b/plugin/src/lib.rs @@ -2,19 +2,7 @@ pub mod cpu_service; pub mod stats; pub mod system_stats; -// cxx-qt-build emits a QQmlEngineExtensionPlugin C++ class with Q_PLUGIN_METADATA -// alongside an `init_cxx_qt_qml_module__plugin()` symbol whose only purpose is -// to anchor that translation unit. Without referencing it from Rust, the linker -// drops the .o containing the plugin class - Qt then dlopens the .so, finds no -// plugin metadata, and never calls qml_register_types_NovaStats. -unsafe extern "C" { - fn init_cxx_qt_qml_module_NovaStats_plugin() -> bool; -} - #[ctor::ctor(unsafe)] fn on_dylib_load() { eprintln!("[nova-plugin] dylib loaded (libNovaStats.so)"); - unsafe { - init_cxx_qt_qml_module_NovaStats_plugin(); - } }