【问题标题】:C++ version of system header files cannot be found [closed]找不到系统头文件的C++版本[关闭]
【发布时间】:2020-07-02 11:51:48
【问题描述】:

使用“...在项目中添加 sqlite.c 后”我应该继续,因为一切都很好。 cassertcerrnocstdio 之类的标头确实存在,并且通常编译器会看到它们并进行编译。

sqlite3.c 添加到项目中后,现在我想这些头文件的.h 版本(assert.herrno.h 等)首先被添加到编译中,然后阻止包含c*其他文件中的头文件。

编译器报告这个:"cassert: No such file or directory",这不是事实。

我正在使用qmake/gcc进行编译。

我该如何解决这个问题?

编辑: 问题似乎与预编译头有关。在@Caduchon 的评论之后,我再次查看了编译日志,然后我看到了预编译头文件:

gcc -x c++-header pre.hpp

...

gcc -x c-header pre.hpp

预编译的头文件被添加到编译中 2 次。第二个是c-header。我想当项目中没有.c 文件时,预编译的头文件只被处理了1 次c++-header。但是当还有一个.c文件时,它也被编译为c-header

【问题讨论】:

  • 包含cassert 等的文件应编译为C++。您是否将它们编译为 C?如果项目包含 C++ 和 C 文件,则应使用正确的语言编译每个文件。
  • 我一如既往地使用 C++ 进行编译。我只添加了 sqlite3.c。我没有更改编译器。
  • 许多编译器会自动将.c文件编译为C。尝试重命名文件,看看问题是否消失。
  • 其实我已经尝试过将QMAKE_CC设置为C++编译器,确定没有区别。
  • 您的文件以某种方式被编译为 C(或至少使用适合 C 的包含路径)是唯一有意义的解释。 <assert.h> 以某种方式阻止 <cassert> 被包括在内的想法是没有意义的。

标签: c++ c sqlite gcc qmake


【解决方案1】:

问题是因为预编译的头文件。当.c 文件被引入项目时,预编译的头文件也被编译为c-header 文件。注释掉 C 编译器标头的 C++ 部分解决了问题:

#ifdef __cplusplus
#endif

【讨论】:

    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多