【问题标题】:Cmake : causing non existent errorsCmake:导致不存在的错误
【发布时间】:2020-11-10 17:00:27
【问题描述】:

在我的 C 项目中,我有 4-5 个文件。首先,我通过在包含部分中直接包含源文件来测试它们。 我使用代码块来完成。我的程序运行得非常好。

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

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

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

我已经包含了 string.h 仍然存在错误。当我直接在代码块中运行时,这些错误从未出现过。我尝试将编译器更改为代码块文件夹中的编译器。还是没用。 有什么建议,比如我应该让它工作的编译器吗? Idk 代码块默认编译器位置在哪里..

【问题讨论】:

  • 您是否尝试过阅读此功能的文档?如man 3 strnlen?
  • 这个函数在string.h中似乎没有按照标准定义(至少以cppreference.com为代表)。我发现的所有 strnlen 函数都需要 2 个参数。不确定代码块从哪里获得此功能,但您不能依赖此功能可用于其他编译器...

标签: c makefile cmake codeblocks


【解决方案1】:

这与 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 上(例如,某些编译器可能不会在其头文件或运行时库中提供该函数)。

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 2011-07-21
    • 1970-01-01
    • 2016-02-24
    • 2018-03-04
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多