CMake:导致不存在的错误

问题描述

在我的C项目中,我有4-5个文件。首先,我通过直接在include部分包含源文件来测试它们。 我使用代码块来做到这一点。我的程序运行得很好。

但是当我尝试使用Cmake构建项目时出现了问题。 我将项目的生成器指定为MingW Makefiles,并勾选了“ Use default native compiler”。 完成配置和生成

使用命令mingw32-make运行时出现错误

error: too few arguments to function 'strnlen'
 int len=strnlen(buf);

我已包含string.h,但错误仍然存​​在。当我直接在代码块中运行时,这些错误从未出现过。我尝试将编译器更改为代码文件夹中的编译器。窗台没用。 有什么建议,例如我应该使用哪个编译器? IDK代码块的认编译器位置在哪里。.

解决方法

这与cmake或代码块无关。您的代码是错误的。 strnlen需要两个参数。之前编译过的代码(如果您运行过它,可能会崩溃),仅是因为在C中您可以做一些愚蠢的事情,例如使用从未声明过的函数,而C会为您“有用”(不是!)声明该函数。

因此,在进行编译的代码中,编译器“有帮助地”添加了一个隐式声明,如下所示:

int strnlen(...);
// in C this means exactly the same as
int strnlen(); // a function returning int and taking any number of arguments (!)

然后的问题是,这不是该函数的正确定义,程序具有未定义的行为,可能会崩溃,或者它似乎可以运行,并且在您最不希望它运行时会中断(通常在演示或如果这是家庭作业,则对您的教授不起作用。

您需要弄清楚该特定功能要使用的标题。在Linux和Windows上将是string.h,但在Windows上并不总是存在(例如,某些编译器可能未在其标头或运行时库中提供该功能)。