Public bug reported:

Summary
=======
Installing libgcc-16-dev alongside clang-N is enough to break clang++: it fails 
to link any C++ program with `ld: cannot find -lstdc++`. This happens even 
though the system default gcc is 15 and libstdc++-15-dev is available. 
libgcc-16-dev is routinely pulled in transitively (e.g. by libboost-all-dev via 
the fortran chain), so users hit this without ever asking for gcc-16.

Steps to reproduce (clean ubuntu:26.04)
=======================================
    apt-get update
    apt-get install -y --no-install-recommends clang-22 libgcc-16-dev
    echo 'int main(){}' > /t.cpp
    clang++-22 /t.cpp -o /t

Expected
========
Linking succeeds (default gcc is 15 and libstdc++-15-dev provides libstdc++).

Actual
======
    clang++-22: warning: future releases of the clang compiler will prefer GCC 
installations containing libstdc++ include directories; 
'/usr/lib/gcc/x86_64-linux-gnu/15' would be chosen over 
'/usr/lib/gcc/x86_64-linux-gnu/16' [-Wgcc-install-dir-libstdcxx]
    /usr/bin/x86_64-linux-gnu-ld.bfd: cannot find -lstdc++: No such file or 
directory
    clang++-22: error: linker command failed with exit code 1

Root cause
==========
libgcc-16-dev populates /usr/lib/gcc/x86_64-linux-gnu/16/ with the GCC runtime 
objects (crtbegin.o, libgcc.a). clang's GCC-installation detector selects the 
highest-versioned directory containing those objects (16 over 15) and assumes 
libstdc++ lives in the same prefix. Since libstdc++-16-dev is not installed, 
-lstdc++ cannot be found. gcc-16-base on its own does NOT trigger this (it 
creates no runtime dir); libgcc-16-dev is the minimal trigger.

The clang heuristic itself is being addressed upstream in LLVM
(https://github.com/llvm/llvm-project/pull/145056 - "Take libstdc++ into
account during GCC detection"; the -Wgcc-install-dir-libstdcxx warning
above comes from that work, and a future release will prefer the
complete dir, i.e. 15). This report is about the Ubuntu packaging
experience: a default clang install silently lands in a non-linkable
state via ordinary transitive deps.

Suggested fixes (packaging side)
================================
- Ship a clang driver default that pins --gcc-install-dir to the distro default 
gcc, or
- Have the clang package Depend/Recommend a matching libstdc++ for the highest 
installable gcc runtime, or
- Document the libstdc++-<N>-dev requirement prominently.

Environment
===========
- Ubuntu 26.04
- clang-22 (llvm-toolchain-22), default gcc 15.2.0, gcc-16-base 16-20260322
- Reproduced in a clean ubuntu:26.04 container.

** Affects: llvm-toolchain-22 (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2154746

Title:
  Installing libgcc-16-dev and clang-N together breaks clang++ (cannot
  find -lstdc++)

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/llvm-toolchain-22/+bug/2154746/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to