You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash调用的Clang与ClangTool差异及CMake头文件路径优化咨询

问题:Clang工具链开发的ast_extract工具无法找到stddef.h,如何实现无需额外参数运行?

我基于教程开发了一款名为ast_extract的工具,用于分析libpng源码,核心实现代码如下:

llvm::cl::OptionCategory ASTExtractCategory("ASTExtract tool options");
llvm::Expected<clang::tooling::CommonOptionsParser> optionParser = clang::tooling::CommonOptionsParser::create(argc, argv, ASTExtractCategory);
clang::tooling::ClangTool tool(optionParser->getCompilations(), optionParser->getCompilations().getAllFiles());

运行该工具时,出现了找不到stddef.h的编译错误,具体报错信息如下:

1 error generated.
Error while processing /data/tfk/study/PUT/libpng/pngmem.c.
In file included from contrib/libtests/pngvalid.c:27:
/usr/include/signal.h:301:11: fatal error: 'stddef.h' file not found
  301 | # include <stddef.h>
      |           ^~~~~~~~~~

目前我可以通过添加额外参数临时解决该问题:

ast_extract --extra-arg='-I/data/tfk/llvm/lib/clang/17/include'

但直接使用compile_commands.json中记录的clang命令执行时,却不存在这个问题:

clang -c -DHAVE_CONFIG_H -I. -g -O2 -fPIC -DPIC -o .libs/pngmem.o pngmem.c

请问如何修改ast_extract工具,使其无需手动添加额外参数即可正常运行?


更新

已通过在CMakeLists.txt中添加以下规则实现了解决方案:

# Install the compiler header files that libtool cannot find (such as stddef.h)
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR})
install(TARGETS ast_extract DESTINATION bin)
install(DIRECTORY ${LLVM_INCLUDE_DIR}/../lib/clang/${LLVM_VERSION_MAJOR}/include DESTINATION lib/clang/${LLVM_VERSION_MAJOR})

message(STATUS "LLVM_INCLUDE_DIRS: ${LLVM_INCLUDE_DIRS}")
message(STATUS "CLANG_INCLUDE_DIRS: ${CLANG_INCLUDE_DIRS}")

不过当前引用stddef.h所在路径的写法${LLVM_INCLUDE_DIR}/../lib/clang/${LLVM_VERSION_MAJOR}/include较为繁琐,是否存在可以直接对应该路径的CMake内置变量?


内容的提问来源于stack exchange,提问作者Fanke Tong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:28:19