Answer

问题及解答

在openSUSE Leap 15.6 下安装 gcc15

Posted by haifeng on 2026-08-31 09:17:21 last update 2026-08-31 09:21:32 | Edit | Answers (0)

如果安装的系统是 openSUSE Leap 15.6, 那么gcc 默认安装的是 7.5.0 版本, 如果安装 clang, 则 clang 会默认寻找 gcc15 的头文件. 这会导致 clang 找不到 algorithm 这样的头文件.

事实上, 可能同时安装了 gcc7 和 gcc15

ls -la /usr/bin/gcc*
lrwxrwxrwx 1 root root       5  8月 23  2021 /usr/bin/gcc -> gcc-7
-rwxr-xr-x 2 root root 2210656  2月 10  2026 /usr/bin/gcc-15
-rwxr-xr-x 1 root root 1026488  1月 25  2025 /usr/bin/gcc-7
lrwxrwxrwx 1 root root       8  8月 23  2021 /usr/bin/gcc-ar -> gcc-ar-7
-rwxr-xr-x 1 root root   35488  2月 10  2026 /usr/bin/gcc-ar-15
-rwxr-xr-x 1 root root   31168  1月 25  2025 /usr/bin/gcc-ar-7
lrwxrwxrwx 1 root root       8  8月 23  2021 /usr/bin/gcc-nm -> gcc-nm-7
-rwxr-xr-x 1 root root   35488  2月 10  2026 /usr/bin/gcc-nm-15
-rwxr-xr-x 1 root root   31168  1月 25  2025 /usr/bin/gcc-nm-7
lrwxrwxrwx 1 root root      12  8月 23  2021 /usr/bin/gcc-ranlib -> gcc-ranlib-7
-rwxr-xr-x 1 root root   35488  2月 10  2026 /usr/bin/gcc-ranlib-15
-rwxr-xr-x 1 root root   31168  1月 25  2025 /usr/bin/gcc-ranlib-7

上面表明, 系统同时安装了 GCC 7.5.0GCC 15,而 /usr/bin/gcc 软链接指向的是 GCC 7.

但是 Clang 17 在编译时默认去找 GCC 15 的头文件路径, 这就是为什么报错 ignoring nonexistent directory "/usr/bin/../lib64/gcc/x86_64-suse-linux/15/..."

 

解决办法是安装 GCC 15 的 C++ 头文件(让 Clang 正常工作)

Clang 17 想用 GCC 15 的头文件, 但 GCC 15 可能只安装了 gcc 没有安装 g++ 开发包. 使用下面的命令安装完整的 GCC 15:

sudo zypper install gcc15-c++

安装后,GCC 15 的 C++ 头文件会在 /usr/include/c++/15/,Clang 就能找到了.

 

测试

1. 创建测试文件 test.cpp

echo '#include ' > test.cpp

2. 编译

clang++ -I/usr/include/c++/7 -I/usr/include/x86_64-linux-gnu/c++/7 -L/usr/lib64 test.cpp -c -o test.o

3. 返回下面的表示正常工作
clang++: warning: argument unused during compilation: '-L/usr/lib64' [-Wunused-command-line-argument]

 


输入下面的命令, 测试 Clang 是否能自动找到 GCC 15 的头文件

# clang++ -v -x c++ /dev/null -fsyntax-only 2>&1 | grep -A 20 "include"


"/usr/bin/clang-17" -cc1 -triple x86_64-suse-linux -fsyntax-only -disable-free -clear-ast-before-backend -disable-
llvm-verifier -discard-value-names -main-file-name null -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-poi
nter=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-6
4 -tune-cpu generic -debugger-tuning=gdb -v -fcoverage-compilation-dir=/usr/lib64/clang/17 -resource-dir /usr/lib64
/clang/17 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/15/../../../../include/c++/15 -internal-isystem
/usr/bin/../lib64/gcc/x86_64-suse-linux/15/../../../../include/c++/15/x86_64-suse-linux -internal-isystem /usr/bin
/../lib64/gcc/x86_64-suse-linux/15/../../../../include/c++/15/backward -internal-isystem /usr/lib64/clang/17/includ
e -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/15/../../../../x86
_64-suse-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro
-fdebug-compilation-dir=/usr/lib64/clang/17 -ferror-limit 19 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -f
addrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -x c++ /dev/null
clang -cc1 version 17.0.6 based upon LLVM 17.0.6 default target x86_64-suse-linux
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/bin/../lib64/gcc/x86_64-suse-linux/15/../../../../include/c++/15
/usr/bin/../lib64/gcc/x86_64-suse-linux/15/../../../../include/c++/15/x86_64-suse-linux
/usr/bin/../lib64/gcc/x86_64-suse-linux/15/../../../../include/c++/15/backward
/usr/lib64/clang/17/include
/usr/local/include
/usr/bin/../lib64/gcc/x86_64-suse-linux/15/../../../../x86_64-suse-linux/include
/usr/include
End of search list.

 

输出中没有 ignoring nonexistent directory 的警告, 表示 clang 已经能成功找到 gcc15 的头文件了.