【发布时间】:2020-07-02 11:51:48
【问题描述】:
使用“...在项目中添加 sqlite.c 后”我应该继续,因为一切都很好。 cassert、cerrno、cstdio 之类的标头确实存在,并且通常编译器会看到它们并进行编译。
将sqlite3.c 添加到项目中后,现在我想这些头文件的.h 版本(assert.h、errno.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>被包括在内的想法是没有意义的。