[layer-shell-qt] [Bug 524317] New: Linker error, expecting to have Qt::WaylandClient

Misha <[email protected]>
Newsgroups gmane.comp.kde.devel.bugs
Message-ID <[email protected]/>
https://bugs.kde.org/show_bug.cgi?id=524317

            Bug ID: 524317
           Summary: Linker error, expecting to have Qt::WaylandClient
    Classification: Frameworks and Libraries
           Product: layer-shell-qt
      Version First unspecified
       Reported In:
          Platform: Fedora RPMs
                OS: Linux
            Status: REPORTED
          Severity: minor
          Priority: NOR
         Component: general
          Assignee: [email protected]
          Reporter: [email protected]
  Target Milestone: ---

DESCRIPTION

So, I am trying to make an app very similar to spectacle, but for translation
of text and new words learning.

And when I am trying to compile my app with these deps (I've tried to add
Qt::WaylandClient dependency after 1st linker error, but it has'nt resolved my
issue): 

```
target_link_libraries(QBackgroundAppWithShortcutToShow
    PRIVATE
        Qt::Core
        Qt::Widgets
        Qt::DBus
        Qt::WaylandClient 
        LayerShellQt::Interface
)
```

STEPS TO REPRODUCE

1. I've tried to compile my app with LayerShellQt as a dependency. 
Cmake and 'hello world' project example:
https://github.com/Maslyna/LayerShellQtLinkerBugExample/blob/master/CMakeLists.txt 

OBSERVED RESULT

I got linker errors: 

```
/usr/bin/ld.bfd: /usr/lib64/libLayerShellQtInterface.so.6.7.4: undefined
reference to
`QtWaylandClient::QWaylandWindow::updateExposure()@Qt_6.11_PRIVATE_API'
/usr/bin/ld.bfd: /usr/lib64/libLayerShellQtInterface.so.6.7.4: undefined
reference to `typeinfo for
QtWaylandClient::QWaylandShellSurface@Qt_6.11_PRIVATE_API'
/usr/bin/ld.bfd: /usr/lib64/libLayerShellQtInterface.so.6.7.4: undefined
reference to
`QtWaylandClient::QWaylandShellIntegration::~QWaylandShellIntegration()@Qt_6.11_PRIVATE_API'
/usr/bin/ld.bfd: /usr/lib64/libLayerShellQtInterface.so.6.7.4: undefined
reference to `QtWaylandClient::QWaylandShellSurface::sendProperty(QString
const&, QVariant const&)@Qt_6.11_PRIVATE_API'
...
Basically 24 linker errors from libLayerShellQtInterface.so that are expecting
to have Qt::WaylandClientPrivate
```

EXPECTED RESULT

Successful compilation

POSSIBLE SOLUTION AND ROOT CAUSE

I think, the root cause is in 
https://invent.kde.org/plasma/layer-shell-qt/-/blob/ecebbfed0b42dbdb0dffa14e02e8ea3c345f0239/src/CMakeLists.txt 
at lines 35-36 we are declaring Qt::WaylandClientPrivate as PRIVATE:

```
target_link_libraries(LayerShellQtInterface PUBLIC Qt::Gui) 
target_link_libraries(LayerShellQtInterface PRIVATE Qt::WaylandClientPrivate
Wayland::Client PkgConfig::XKBCOMMON)
```

Since LayerShellQtInterface's own implementation depends on symbols from
libQt6WaylandClient.so - any consumer that doesn't also explicitly force-link
Qt6::WaylandClient gets this undefined reference at link time, because
"--as-needed" (Fedora's default) drops the library from the link line before it
can satisfy that transitive symbol.

Workaround that works for me:

```
target_link_libraries(QBackgroundAppWithShortcutToShow
    PRIVATE
        Qt::Core
        Qt::Widgets
        Qt::DBus
        -Wl,--no-as-needed
        Qt::WaylandClient
        -Wl,--as-needed
        LayerShellQt::Interface
)
```

SOFTWARE/OS VERSIONS

mordyntsev@fedora:~$ rpm -q layer-shell-qt qt6-qtwayland
layer-shell-qt-6.7.4-1.fc44.x86_64
qt6-qtwayland-6.11.1-1.fc44.x86_64


Operating System: Fedora Linux 44
KDE Plasma Version: 6.7.4
KDE Frameworks Version: 6.29.0
Qt Version: 6.11.1
Kernel Version: 7.1.8-200.fc44.x86_64 (64-bit)
Graphics Platform: Wayland

ADDITIONAL INFORMATION

Here's a project example, that can recreate my problem:
https://github.com/Maslyna/LayerShellQtLinkerBugExample.git

-- 
You are receiving this mail because:
You are watching all bug changes.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.