对C中头文件中定义的函数的未定义引用

ddrv8njm  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(92)

这似乎是一个已经问过的问题,但我

  • 我没有找到关于我的案件的具体信息,例如,我已经做了一些事情
  • 我无法正确编译一个程序,尽管包括所有文件和编写一个希望正常的头文件,并包括他们在任何地方,我需要他们

我在app.c中的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "adding_tasks.h"
#include "viewing_tasks.h"
#include "removing_tasks.h"
#include "completing_tasks.h"
#include "buffer_cleaning.h"

int main()
{   
...
return 0;
}

字符串
我的代码来自completing_tasks.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "buffer_cleaning.h"
#include "completing_tasks.h"

void task_complete(char ***all_tasks, int *num_tasks)
{
...
}


我的completing_tasks.h只是为了确保它是正确的,我不是盲目的:

#ifndef COMPLETING_TASKS_H
#define COMPLETING_TASKS_H

void task_complete(char ***all_tasks, int *num_tasks);

#endif


我得到的traceback:

app.c:(.text+0x6d): undefined reference to `clear_input_buffer'
/usr/bin/ld: app.c:(.text+0x88): undefined reference to `update_task_list'
/usr/bin/ld: app.c:(.text+0xa8): undefined reference to `task_view'
/usr/bin/ld: app.c:(.text+0xc8): undefined reference to `task_remove'
/usr/bin/ld: app.c:(.text+0xe5): undefined reference to `task_complete'
collect2: error: ld returned 1 exit status


我编译它的方式:

gcc -o app app.c adding_tasks.c completing_tasks.c removing_tasks.c buffer_cleaning.c


问题来了:

  • 我有什么明显的错误让我看起来像个傻瓜吗?
  • 若否,原因为何?
  • 这是否源于buffer_cleaning.h的递归?如果是,如果我需要在所有这些文件中使用它,我该怎么做来防止它?
  • 我怎样才能改进代码,使它可能开始工作,或者至少给我另一个错误?

如果需要的话,我准备提供更多的代码片段。

szqfcxe2

szqfcxe21#

这些函数不是在头文件中 * 定义的 *,它们只是在头文件中 * 声明的 *。
声明满足编译器,所以翻译单元编译没有错误。然而,这些是 * 链接器 * 错误。链接器解析单独编译的翻译单元之间的引用。
鉴于你所陈述的GCC命令行,至少不清楚为什么task_complete没有被解析(唯一一个你提供源代码的未定义符号(尽管被省略了)。但是我们只有你的话,那是导致这些错误的命令行。你应该发布整个构建日志,而不仅仅是错误。
我有什么明显的错误让我看起来像个傻瓜吗?
除了没有发现这些是链接器错误,所以代码必须编译,没有,但你没有提供所有提供的诊断信息。从GCC命令行提供完整的日志到ld returned 1 exit。还将-Wall -Werror添加到GCC命令行。
若否,原因为何?
如上所述-它们是链接器错误。您的链接有问题。要么命令行不符合规定,要么列出的翻译单元不包含规定的代码。例如,您是否保存了文件。
这是否源于buffer_cleaning.h的递归?
不是因为你有链接器,而不是编译器或预处理器错误。
如果是这样,我该怎么做,以防止它,如果我需要它在所有这些文件?
不是问题所在。
我怎样才能改进代码,使它可能开始工作,或者至少给我另一个错误?
这是一个链接器问题,而不是代码问题。你必须成功地链接列出的模块,这些模块必须包含指定的符号 definitions

相关问题