无法强制 clang CompilerInstance 对象将标头解析为 C++ 文件

2024-01-08

我有一个名为的 C++ 标头class.h我想解析:

class MyClass
{
  public:
    Class() {}
    ~Class() {}
    bool isTrue() const;
    bool isFalse() const;
  private:
    bool m_attrib;
};

bool MyClass::isTrue() const
{
  return true;
}
bool MyClass::isFalse() const
{
  return false;
}

我将 clang 编译器实例与 AST 使用者一起使用。我的所有代码都可以与 c 源文件配合使用。但我无法配置/强制 CompilerInstance 必须使用的语言。 这是我使用的代码:

m_ci = new clang::CompilerInstance();
/*configure the langage to use*/
clang::CompilerInvocation *invocation = new clang::CompilerInvocation;
clang::LangOptions langOpts;
/*with langage = clang::IK_CXX*/
langOpts.CPlusPlus = 1; 
invocation->setLangDefaults(langOpts, langage);
m_ci->setInvocation(invocation);
m_ci->createDiagnostics();
llvm::IntrusiveRefCntPtr<clang::TargetOptions> pto( new clang::TargetOptions());
pto->Triple = llvm::sys::getDefaultTargetTriple();
clang::TargetInfo *pti = clang::TargetInfo::CreateTargetInfo(m_ci->getDiagnostics(), pto.getPtr());
m_ci->setTarget(pti);
m_ci->createFileManager();
m_ci->createSourceManager(ci->getFileManager());
m_ci->createPreprocessor();
/*add some header search paths*/
m_hso = llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions>(new clang::HeaderSearchOptions());
m_hso->AddPath( pathName.c_str(),
                clang::frontend::Angled,
                false,
                false);
/*add the source file*/
const clang::FileEntry *pFile = m_ci->getFileManager().getFile(fileName.c_str());
m_ci->getSourceManager().createMainFileID(pFile);
/*parse*/
clang::InitializePreprocessor(m_ci->getPreprocessor(),
                              m_ci->getPreprocessorOpts(),
                              *m_hso,
                              m_ci->getFrontendOpts()); 
m_ci->createASTContext();
m_headerElements = new HeaderElements();
m_ci->setASTConsumer(m_headerElements);
m_ci->getDiagnosticClient().BeginSourceFile(m_ci->getLangOpts(),
                                            &m_ci->getPreprocessor());
clang::ParseAST(m_ci->getPreprocessor(), m_headerElements, m_ci->getASTContext());
m_ci->getDiagnosticClient().EndSourceFile();

当我测试这个时,解析器会抛出如下错误:

error: unknown type name 'class'

还有测试

 m_ci->getLangOpts.CPlusPlus == 0 

是 true,因此似乎 LangOptions 未应用于 CompilerInstance。


经过一些测试和大量搜索后,我已经弄清楚如何做到这一点。为了设置 CompilerInstance 对象的语言选项,您只需执行以下操作:

clang::CompilerInstance ci;
//initialize lot of stuff
ci.createDiagnostics();
ci.createFileManager();
ci.createSourceManager(m_ci.getFileManager());
std::shared_ptr<clang::TargetOptions> pto = std::make_shared<clang::TargetOptions>();
pto->Triple = llvm::sys::getDefaultTargetTriple();
clang::TargetInfo *pti = clang::TargetInfo::CreateTargetInfo(ci.getDiagnostics(), pto);
ci.setTarget(pti);
//force langage to C++
ci.getLangOpts().CPlusPlus = 1;
ci.createPreprocessor(clang::TU_Complete);

重要的是在创建或重新创建预处理器之前配置 LangOptsCompilerInstance::createPreprocessor()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法强制 clang CompilerInstance 对象将标头解析为 C++ 文件 的相关文章

  • 格式说明符%02x

    我有一个简单的程序 include
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 替换 HTML 正文中的文本

    我正在尝试替换 Outlook 2010 中已创建的模板正文中的文本 这样做的目的是让用户可以相当轻松地更新电子邮件发送到的联系人 Sub NewUserEmail Dim myItem As Outlook MailItem Dim st
  • React.js 组件生命周期、状态行为和 JavaScript 的异步特性

    我对预期结果和实际结果有疑问 尽管fetchData and fetchnumberOfCommits 方法是从componentWillMount 数组仍然没有数据 但最后 render 方法被调用两次 其中数组从 API 获取了数据 我
  • 使用 Facebook SDK 和 Windows Azure SDK 时的 xcode 链接问题

    我正在构建一个使用最新 Facebook SDK v3 1 和 Windows Azure iOS Toolkit SDK 的应用程序 现在 Azure SDK 需要将 all load 和 ObjC 标志添加到 生成设置 中的 其他链接器
  • 在R中添加时间

    R 中的日期和时间非常混乱 我只想随机生成一些 24 小时时钟时间 然后添加到它们中 随机生成 library lubridate hourTime lt as list format seq POSIXt as POSIXct Sys D
  • DDD - 数据库中跨界上下文和不同模式的实体一致性

    我正在使用 Entity Framework Code First 实现 DDD 我的域模型保持原样 没有任何映射层 我正在遵循期间建议的方法Tech Ed https channel9 msdn com Events TechEd Eur
  • 为所有页面生成本地资源

    有什么方法或技巧可以自动为 Visual Studio 2010 中的所有页面生成本地资源吗 我有大约 500 个页面和用户控件 很难为每个页面逐一生成资源 有任何附加组件或扩展吗 沙欣 写个剧本行不行 资源文件只不过是一个 XML 文件
  • 错误:您必须至少安装一个 postgresql-client- 软件包

    我正在尝试在 Ubuntu 中安装 PostgreSQL 我按照以下指示进行操作 opt PostgreSQL 9 0 doc postgresql html installation html 似乎已成功安装 PostgreSQL 但作为
  • 无法开始在 iOS 中接收远程控制事件

    在我的应用程序中 我想让用户控制后台音频播放 我在 plist 中设置了背景模式 并在背景中设置了播放模式 就像我想要的那样 但是我无法通过触摸控制按钮得到任何响应 我设置了AudioSession像这样 AVAudioSession sh
  • 如何将RapidJSON文档序列化为字符串?

    如何将RapidJSON文档序列化为字符串 在所有示例中 序列化文本通过以下方式重定向到标准输出 FileStream 但我需要将其重定向到字符串变量 In the 项目的第一页 http rapidjson org 代码已经展示了如何将文
  • 如何更新旧的 Android 项目以适应新的 Android SDK 工具的更新?

    以前我使用的是旧版本Android SDK工具 http developer android com sdk tools notes html 现在我搬到了一台新电脑 从头开始设置我的新开发环境 并从以前的电脑复制并导入项目 现在 如果我在
  • JMX 和 RMI 的区别

    JMX 的目的是什么以及它的用途是什么 我一直在浏览 JMX 上的一些教程 它们所做的就是注册一些 Mbean 并从 jconsole 调用这些 Mbean 如果这就是它的目的 那么 JMX 和 RMI 远程过程调用 之间有什么区别 提前致
  • 如何使用 VBA 将样式应用于 Word 中的多个选择?

    我创建了一个宏 它将特定的样式应用于文档中选择的任何内容 但是 在草稿视图中 当用户在样式区域窗格中单击以选择一个段落 然后按住 Ctrl 键并单击其他段落时 运行此宏时不会应用此附加选择 Sub BodyTextApply Selecti
  • 在单元测试中伪造我的数据库层的方法是什么?

    我有一个关于单元测试的问题 假设我有一个带有一个创建方法的控制器 该方法将新客户放入数据库中 code a bit shortened public actionresult Create Formcollection formcollec
  • 如何使用 javascript 将 json 数据写入 google 工作表

    我正在尝试使用 javascript 将 json 数据渲染到 google 工作表 我尝试搜索大量文档 并且已经尝试了几个小时 我确实在工作表中输入了一行数据 但我需要在正确的行和列中渲染整个 json 数据集 function rend
  • 如何在Spring字符串到数组或列表转换中转义“,”(逗号)

    我们有一个 Spring 绑定 它将字符串转换为Lists 使用 Spring 提供的默认转换器 例如 如果我们有a b c从表单推送然后控制器得到一个List与元素 a b c 我们不需要在代码中做任何特殊的事情 我在处理数据中的逗号时遇
  • 自动点击弹出按钮

    我有以下按钮突然出现在窗口上 span class a b c Accept Waiting Chat span 是否可以拦截它并自动点击它 我正在考虑 JS 或 Greymonkey 扩展中的一些东西 Ideas None
  • 阻止直接访问文件,但允许通过 jquerys 加载函数访问

    我在用着jQuery通过它向用户显示某个页面 load 功能 我这样做是为了允许用户自定义网站 让他们能够满足自己的需求 目前 我正在尝试显示该文件feed php容器内部main php 我遇到一个问题 我想阻止直接访问文件 即 直接进入
  • 使用 MSBuild 4.0 记录构建消息

    我在代码中使用 MsBuild 4 0 如下所示 var globalProperties new Dictionary
  • 使用 Python BeautifulSoup 库解析 Span HTML 标签中的信息

    我正在编写一个 Python 网络抓取工具 用于获取特定股票的价格 在我的程序末尾 有一些打印语句可以正确解析 html 数据 以便我可以在某个 HTML span 标记内获取股票的价格信息 我的问题是 我该怎么做 我已经获得了正确的 HT
  • 无法强制 clang CompilerInstance 对象将标头解析为 C++ 文件

    我有一个名为的 C 标头class h我想解析 class MyClass public Class Class bool isTrue const bool isFalse const private bool m attrib bool