Clang-cl + lld-link + Qt 6.11: undefined symbol QConstIterator<QMetaSequence> when iterating QMetaSequence::Iterable
-
Hi,
I am encountering a linking issue with Qt 6.11.0 (msvc2022_64 official build) when using clang-cl and lld-link on Windows.
The problem only appears under a specific combination of conditions involving QSequentialIterable and iterator usage on QMetaSequence::Iterable.
Environment
- Qt: 6.11.0 (msvc2022_64 official binary)
- Compiler: clang-cl 22.1.7
- Linker: lld-link
- Build system: CMake + Ninja
- C++ standard: C++23
- OS: Windows 11
Minimal Context
This code alone works correctly:
#include <QCoreApplication> #include <QVariant> #include <QMetaSequence> void test() { QVariant v = QVariant::fromValue(QList<int>{1, 2, 3}); auto iterable = v.value<QMetaSequence::Iterable>(); // No iteration → OK }
Issue Reproduction
The issue appears when iterator APIs on QMetaSequence::Iterable are used in a translation unit that includes <QSequentialIterable>.
(1) QSequentialIterable is included
#include <QSequentialIterable>(2) iterator APIs are actually used
For example:
for (auto it = iterable.constBegin(); it != iterable.constEnd(); ++it) { qDebug() << *it; }or equivalent
begin()/end()or range-based for loops.
Important Clarification
The issue does NOT occur if:
- <QSequentialIterable> is included but no iterator API is used
The issue also does NOT occur if:
- iterator APIs are used but <QSequentialIterable> is NOT included
It only triggers when:
<QSequentialIterable> + iterator usage on QMetaSequence::Iterableare combined under clang-cl + lld-link.
Error
lld-link: error: undefined symbol: __declspec(dllimport) public: __cdecl QConstIterator<class QMetaSequence>::QConstIterator<class QMetaSequence>(struct QConstIterator<class QMetaSequence> &&) >>> referenced by Test\CMakeFiles\Test.dir\Test.cpp.obj:(public: class QTaggedIterator<class QtMetaContainerPrivate::SequentialConstIterator, void> __cdecl QtMetaContainerPrivate::Sequence::constBegin(void) const) >>> referenced by Test\CMakeFiles\Test.dir\Test.cpp.obj:(public: class QTaggedIterator<class QtMetaContainerPrivate::SequentialConstIterator, void> __cdecl QtMetaContainerPrivate::Sequence::constBegin(void) const) >>> referenced by Test\CMakeFiles\Test.dir\Test.cpp.obj:(public: class QTaggedIterator<class QtMetaContainerPrivate::SequentialConstIterator, void> __cdecl QtMetaContainerPrivate::Sequence::constEnd(void) const) >>> referenced 1 more times
Observations
- Works correctly with MSVC linker (link.exe)
- Fails only with clang-cl + lld-link
- Removing <QSequentialIterable> appears to resolve the issue in my environment.
- QMetaSequence::Iterable itself works as expected in isolation
- The issue is reproducible with iterator APIs only when QSequentialIterable is included
Question
Is this a known ABI / export issue in Qt 6.11 MSVC builds when using clang-cl + lld-link?
Is the combination of <QSequentialIterable> and QMetaSequence::Iterable iterator APIs expected to trigger unresolved symbols in this configuration?
Any clarification or workaround would be appreciated.
-
Hi,
I am encountering a linking issue with Qt 6.11.0 (msvc2022_64 official build) when using clang-cl and lld-link on Windows.
The problem only appears under a specific combination of conditions involving QSequentialIterable and iterator usage on QMetaSequence::Iterable.
Environment
- Qt: 6.11.0 (msvc2022_64 official binary)
- Compiler: clang-cl 22.1.7
- Linker: lld-link
- Build system: CMake + Ninja
- C++ standard: C++23
- OS: Windows 11
Minimal Context
This code alone works correctly:
#include <QCoreApplication> #include <QVariant> #include <QMetaSequence> void test() { QVariant v = QVariant::fromValue(QList<int>{1, 2, 3}); auto iterable = v.value<QMetaSequence::Iterable>(); // No iteration → OK }
Issue Reproduction
The issue appears when iterator APIs on QMetaSequence::Iterable are used in a translation unit that includes <QSequentialIterable>.
(1) QSequentialIterable is included
#include <QSequentialIterable>(2) iterator APIs are actually used
For example:
for (auto it = iterable.constBegin(); it != iterable.constEnd(); ++it) { qDebug() << *it; }or equivalent
begin()/end()or range-based for loops.
Important Clarification
The issue does NOT occur if:
- <QSequentialIterable> is included but no iterator API is used
The issue also does NOT occur if:
- iterator APIs are used but <QSequentialIterable> is NOT included
It only triggers when:
<QSequentialIterable> + iterator usage on QMetaSequence::Iterableare combined under clang-cl + lld-link.
Error
lld-link: error: undefined symbol: __declspec(dllimport) public: __cdecl QConstIterator<class QMetaSequence>::QConstIterator<class QMetaSequence>(struct QConstIterator<class QMetaSequence> &&) >>> referenced by Test\CMakeFiles\Test.dir\Test.cpp.obj:(public: class QTaggedIterator<class QtMetaContainerPrivate::SequentialConstIterator, void> __cdecl QtMetaContainerPrivate::Sequence::constBegin(void) const) >>> referenced by Test\CMakeFiles\Test.dir\Test.cpp.obj:(public: class QTaggedIterator<class QtMetaContainerPrivate::SequentialConstIterator, void> __cdecl QtMetaContainerPrivate::Sequence::constBegin(void) const) >>> referenced by Test\CMakeFiles\Test.dir\Test.cpp.obj:(public: class QTaggedIterator<class QtMetaContainerPrivate::SequentialConstIterator, void> __cdecl QtMetaContainerPrivate::Sequence::constEnd(void) const) >>> referenced 1 more times
Observations
- Works correctly with MSVC linker (link.exe)
- Fails only with clang-cl + lld-link
- Removing <QSequentialIterable> appears to resolve the issue in my environment.
- QMetaSequence::Iterable itself works as expected in isolation
- The issue is reproducible with iterator APIs only when QSequentialIterable is included
Question
Is this a known ABI / export issue in Qt 6.11 MSVC builds when using clang-cl + lld-link?
Is the combination of <QSequentialIterable> and QMetaSequence::Iterable iterator APIs expected to trigger unresolved symbols in this configuration?
Any clarification or workaround would be appreciated.
@Lan-Friend said in Clang-cl + lld-link + Qt 6.11: undefined symbol QConstIterator<QMetaSequence> when iterating QMetaSequence::Iterable:
Is this a known ABI / export issue in Qt 6.11 MSVC builds when using clang-cl + lld-link?
No, but clang-cl is not officially supported: https://doc.qt.io/qt-6/supported-platforms.html#windows
You might create a bug report about it though.