3

I am trying to compile some code with clang++, but I receive an error that for examle iostream could not be found. I know that clang uses the gcc headers by default, so when I compile with g++ everything is fine. Any idea? I have already reinstalled it everything, but the problem persists.

Update: It now works only with clang++ -lc++ Hello-world.cpp -o Hello-world

Update:

❯ clang++ -v -Wall -std=c++23 main.cpp -o main
Ubuntu clang version 18.1.8 (9ubuntu1~24.04)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/10
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/13
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/14
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/14
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/usr/lib/llvm-18/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -dumpdir main- -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/dejo -v -fcoverage-compilation-dir=/home/dejo -resource-dir /usr/lib/llvm-18/lib/clang/18 -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++ -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/x86_64-linux-gnu -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/backward -internal-isystem /usr/lib/llvm-18/lib/clang/18/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wall -std=c++23 -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -fcolor-diagnostics -dwarf-debug-flags "/usr/lib/llvm-18/bin/clang --driver-mode=g++ -v -Wall -std=c++23 main.cpp -o main -dumpdir main-" -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/main-6edf0e.o -x c++ main.cpp
clang -cc1 version 18.1.8 based upon LLVM 18.1.8 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/backward"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++
 /usr/lib/llvm-18/lib/clang/18/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
main.cpp:1:10: fatal error: 'iostream' file not found
    1 | #include <iostream>
      |          ^~~~~~~~~~
1 error generated.

3 Answers3

3

I had same thing happen to me, as I need to compile with clang/++ for Emacs lsp-mode.

   Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/14
   Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/14

Good.

ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/14/.../..."

WT$%#$%#!!!

  1. Verify actually exist. In my case did not. Like the warning ("ignoring") stated.
  2. sudo apt install libstdc++-14-dev to fix.

https://packages.ubuntu.com/search?keywords=libstdc%2B%2B-14-dev&searchon=names&suite=noble&section=all

Clang uses gcc headers https://clangd.llvm.org/guides/system-headers So whether 24.04 is shipping with placeholders for gcc14 or non-dev version of gcc14, idk.

Caveat: Just found out today, Nvidia driver doesn't play nice with setting system to clang/++, so I assume it is not recommended practice in general.
To check:

update-alternatives --get-selections | grep c

To set

sudo update-alternatives --config cc
sudo update-alternatives --config c++

If you build system uses system environment variables for c/c++ (e.g. CMake)
Someone recommended export over -DCMAKE... compiler flags. Seems legit.

export CC=/usr/bin/clang
export CXX=/usr/bin/clang++

P.S. I do not remember if I had to do any symlinks. ln -s ... ...

1

I have the same problem running on x64. The proposed workaround, above, is for aarch64 and doesn't work here for misc reasons.

However I did learn that if I install g++-14 in particular, that makes my hello world clang++ actually build and run. It seems to be that the clang package does not capture its dependencies correctly.

I agree that this is thoroughly horrible. I would think Canonical would not release a major version of their system with a common, important, well-used package broken like this. I would be wrong.

The system is not usable for me as it is and I am going away until it works. Or I'll stay on Mint. Just posting this if others want to get their clang to, uh, actually work in the meantime.

-1
  1. Uninstall all old versions of clang and install the latest version.

    sudo apt update
    sudo apt-get remove clang-* 
    cd /usr/lib/gcc/aarch64-linux-gnu/
    sudo rm -r 8
    sudo apt install clang clang-18 clang-tools-18 g++-13 libstdc++-dev
    

    Results of clang++ --version should be:

    Ubuntu clang version 18.1.3 (1ubuntu1)
    Target: x86_64-pc-linux-gnu
    Thread model: posix
    InstalledDir: /usr/bin
    
  2. Save the following C++ code in Hello-world.cpp.

    #include <iostream>
    using namespace std;
    int main() {
        cout << "Hello, world" << endl;
        return 0;
    }
    
  3. Compile it with clang++ Hello-world.cpp -o Hello-world

  4. Run the compiled code with ./Hello-world

karel
  • 122,292
  • 133
  • 301
  • 332