升级到 Ubuntu 13.10“Saucy”后,Clang 现在给出错误消息:
clang -Wall -Werror -std=c99 -ggdb -O0 5.1.c -o 5.1
In file included from 5.1.c:1:
/usr/include/stdio.h:33:11: fatal error: 'stddef.h' file not found
# include <stddef.h>
^
1 error generated.
make: *** [5.1] Error 1
顺便说一句,我包含的标题是
stdio.h
不是 stddef.h
但我假设 stdio.h
引用或 #includes
stddef.h
当我尝试在未安装
clang-tidy
的情况下运行 clang
时,出现此错误。
安装 clang 修复了此错误。 IMO 当
clang-tidy
在 GCC 和系统路径中查找标头并且这些标头的 clang
版本/符号链接丢失时,会发生此错误。
这是 ubuntu 中的一个已知错误。看看这里:https://bugs.launchpad.net/ubuntu/+source/llvm-defaults/+bug/1242300
看来临时解决方法是更正符号链接:
对于 3.5 LLVM 工具链,符号链接似乎 /usr/lib/clang/3.5/include 错误地指向 ../../llvm-3.4/lib/clang/3.5/include,但应该指向 ../../llvm-3.5/lib/clang/3.5/include
解决方法(当然)是手动更正符号链接。
对于 3.4 工具链,/usr/lib/clang/3.4/include 不存在于 全部。我还没有在 Ubuntu 上尝试过 LLVM 3.4 所以我不知道是否创建 到 ../../llvm-3.4/lib/clang/3.4/include 的符号链接将修复 问题,但看起来确实有可能。
使用 cmake 和 gcc 中的 clang-tidy,您可以在 CMakeLists.txt 中添加以下内容
if(CMAKE_EXPORT_COMPILE_COMMANDS)
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
endif()
这将导致“compile_commands.json”文件包含正确的 gcc 包含内容。
解决方案来自 kitware 问题跟踪器:compile_commands.json 中缺少 c++ 标头路径
这个答案有点偏离主题,但这是我的特定问题在搜索引擎上的最高点击率
请注意,我通过执行以下操作解决了上述错误:
$ sudo apt-get install clang
在我的特定情况下,我的
cmake
文件中的某些内容可能存在问题,但我尚未确定。
就我而言,这是因为文件 compile_commands.json 不存在,只是
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .
解决它。
对于 clang16,你可以尝试这个:
export CPLUS_INCLUDE_PATH=/usr/lib/llvm-16/lib/clang/16/include/
(将“llvm-16/lib/clang/16”替换为您安装的实际版本)