这似乎是一个已经问过的问题,但我
- 我没有找到关于我的案件的具体信息,例如,我已经做了一些事情
- 我无法正确编译一个程序,尽管包括所有文件和编写一个希望正常的头文件,并包括他们在任何地方,我需要他们
我在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
的递归?如果是,如果我需要在所有这些文件中使用它,我该怎么做来防止它? - 我怎样才能改进代码,使它可能开始工作,或者至少给我另一个错误?
如果需要的话,我准备提供更多的代码片段。
1条答案
按热度按时间szqfcxe21#
这些函数不是在头文件中 * 定义的 *,它们只是在头文件中 * 声明的 *。
声明满足编译器,所以翻译单元编译没有错误。然而,这些是 * 链接器 * 错误。链接器解析单独编译的翻译单元之间的引用。
鉴于你所陈述的GCC命令行,至少不清楚为什么
task_complete
没有被解析(唯一一个你提供源代码的未定义符号(尽管被省略了)。但是我们只有你的话,那是导致这些错误的命令行。你应该发布整个构建日志,而不仅仅是错误。我有什么明显的错误让我看起来像个傻瓜吗?
除了没有发现这些是链接器错误,所以代码必须编译,没有,但你没有提供所有提供的诊断信息。从GCC命令行提供完整的日志到
ld returned 1 exit
。还将-Wall -Werror
添加到GCC命令行。若否,原因为何?
如上所述-它们是链接器错误。您的链接有问题。要么命令行不符合规定,要么列出的翻译单元不包含规定的代码。例如,您是否保存了文件。
这是否源于buffer_cleaning.h的递归?
不是因为你有链接器,而不是编译器或预处理器错误。
如果是这样,我该怎么做,以防止它,如果我需要它在所有这些文件?
不是问题所在。
我怎样才能改进代码,使它可能开始工作,或者至少给我另一个错误?
这是一个链接器问题,而不是代码问题。你必须成功地链接列出的模块,这些模块必须包含指定的符号 definitions。