无法弄清楚如何让 CMake 为自定义 clang 驱动程序提取正确的标头

Posted

技术标签:

【中文标题】无法弄清楚如何让 CMake 为自定义 clang 驱动程序提取正确的标头【英文标题】:Can't figure out how to get CMake to pull in the correct headers for a custom clang driver 【发布时间】:2017-05-11 23:37:23 【问题描述】:

在这里,CMake 让我很难受。我检查了 llvm、clang 和 extras,并创建了一个自定义驱动程序文件夹,将其添加到 llvm\tools\clang\tools\extra\CMakeLists.txt 并创建了我自己的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.8)
set(LLVM_LINK_COMPONENTS
  Support
  )

set(CMAKE_CXX_FLAGS $LLVM_CONFIG)
set(CMAKE_CXX_COMPILER "clang++")  

add_clang_executable(mydriver
  main.cpp
  )

set(CLANG_LIBS clangFrontend clangDriver clangSerialization clangParse
    clangCodeGen  clangSema clangAnalysis clangEdit clangAST clangLex
    clangBasic )

target_link_libraries(mydriver $CLANG_LIBS)
target_link_libraries(mydriver $LLVM_LIBS)

CMake 工作正常。我以 VS2017 为目标并使用 msbuild 构建 mydriver 项目

λ msbuild tools\clang\tools\extra\mydriver\mydriver.vcxproj

这会导致以下错误:

"C:\dev\llvm-build\tools\clang\tools\extra\mydriver\mydriver.vcxproj" (default target) (1) ->
(ClCompile target) ->
  C:\dev\llvm\tools\clang\tools\extra\mydriver\main.cpp(45): error C2027: use of undefined type 'clang::Preprocessor Options' [C:\dev\llvm-build\tools\clang\tools\extra\mydriver\mydriver.vcxproj]
  C:\dev\llvm\tools\clang\tools\extra\mydriver\main.cpp(45): error C2228: left of '.addRemappedFile' must have class /struct/union [C:\dev\llvm-build\tools\clang\tools\extra\mydriver\mydriver.vcxproj]
  C:\dev\llvm\tools\clang\tools\extra\mydriver\main.cpp(50): error C2664: 'void clang::CompilerInstance::setInvocati on(std::shared_ptr<clang::CompilerInvocation>)': cannot convert argument 1 from 'clang::CompilerInvocation *' to 'st d::shared_ptr<clang::CompilerInvocation>' [C:\dev\llvm-build\tools\clang\tools\extra\mydriver\mydriver.vcxproj]

但是,clangLex 显然包含在我的 CMakeLists.txt 的 CLANG_LIBS 变量中。 clang::PreprocessorOptions 类的文档似乎表明我包含了正确的库。

有什么想法吗?

请注意,这个问题与这个问题密切相关: Generate assembly from C code in memory using libclang

【问题讨论】:

【参考方案1】:

在经典的 SO 方式中,问题在于自发布示例以来包含文件已迁移。 clang documentation 需要一个新的头文件,其实就是在包含路径中。我只需要:

#include <clang/Lex/PreprocessorOptions.h>

对不起各位,这里没什么可看的。

【讨论】:

以上是关于无法弄清楚如何让 CMake 为自定义 clang 驱动程序提取正确的标头的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将库与 cmake 链接?

无法弄清楚如何定义我的 y_test

无法弄清楚如何在同一 ScrollView 中的 WebView 上方添加自定义视图

Java,无法弄清楚如何从回文字符串中删除符号

试图弄清楚如何从 jquery datepicker 中删除假期

为自定义路径类型设置 boost property_tree