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
相关产品推荐
相关产品推荐

