问题描述
在我的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上并不总是存在(例如,某些编译器可能未在其标头或运行时库中提供该功能)。