【发布时间】:2020-11-24 14:39:43
【问题描述】:
我有 5 个文件,我试图在树莓派上使用 gcc 链接,我浏览了一些帖子,但我似乎找不到解决这个问题的方法,所以我想问问是否有人可以看看我做错了什么。
我运行的 make 文件看起来像这样
Mainfile:
gcc -c ./Include/func_1.c
gcc -c ./Include/func_2.c
gcc -c ./Include/func_3.c
gcc -c ./Include/func_4.c
gcc -c ./Include/func_5.c
gcc -c Mainfile.c
gcc -o Mainfile func_1.o func_2.o func_3.o func_4.o func_5.o Mainfile.o
第 1 - 6 行似乎工作正常,我设法制作了目标文件,但是当我尝试将它们链接到第 8 行中的 Mainfile 时,出现以下错误
/usr/bin/ld: /tmp/cc5NQuqi.o: in function `main':
Mainfile.c:(.text+0xfc): undefined reference to `func1_1'
/usr/bin/ld: Mainfile.c:(.text+0x104): undefined reference to `func1_2'
/usr/bin/ld: Mainfile.c:(.text+0x10c): undefined reference to `func2_1'
/usr/bin/ld: Mainfile.c:(.text+0x114): undefined reference to `func2_2'
/usr/bin/ld: Mainfile.c:(.text+0x11c): undefined reference to `func3'
/usr/bin/ld: Mainfile.c:(.text+0x124): undefined reference to `func4_1'
/usr/bin/ld: Mainfile.c:(.text+0x12c): undefined reference to `func4_2'
/usr/bin/ld: Mainfile.c:(.text+0x134): undefined reference to `func5'
collect2: error: ld returned 1 exit status
make: *** [makefile:9: Mainfile] Error 1
似乎无法弄清楚它有什么问题.. 将我的 func c 文件及其头文件放在包含文件夹中,我将头文件包含在 Mainfile 中并测试它是否是我包含 c 文件的代码标题,然后它构建得很好。
有人知道我在 make 文件中做错了什么吗?第一次尝试链接这么多文件并使用 make 文件,非常感谢您的建议。
编辑:
我的主文件看起来像
#include "./Include/func_1.h"
#include "./Include/func_2.h"
...
#include "./Include/func_5.h"
in main()
{
func1_1(argument);
...
func5_1(argument);
return 0;
}
我的 func_1.h 文件看起来像
#ifndef FUNC_1_H
#define FUNC_1_H
// Argument check, is Host name and Port number default?
static void func1_1(int argument);
#endif
那么 func_1.c 文件看起来像
#include "math.h"
#include "func_1.h"
static void func1_1(int argument)
{
printf(argument + 1);
}
【问题讨论】:
-
注意:所有
gcc -c命令都是无用的,它们会创建您不使用的.o 文件。如果你想使用 .o 文件然后告诉它链接 .o 文件而不是 .c 文件(这使它再次编译它们) -
显而易见的猜测是 func1_1、1_2、2_1、2_2、3、4_1、4_2 和 5 没有在任何地方定义。为什么不?您认为定义它们的代码在哪里?
-
试过gcc -o Mainfile func_1.o func_2.o func_3.o func_4.o func_5.o Mainfile.o 还是一样的错误,而且所有的函数都定义在headers里面,然后在里面使用对应的c文件。
-
你能创建一个minimal reproducible example吗?将其缩减为一两个显示问题的简短源文件,并将它们完整发布。听起来您在包含和链接之间存在某种奇怪的混淆(例如,将
.c文件保留在 Include 目录中是不正常的),但从您的描述中很难准确判断您在做什么。 -
@Parko:如果你的意思是最后一条评论,那么这就是你的问题——你不应该在标题中定义你的函数,你应该只declare 在那里,实际上在 .c 文件中定义它们。
标签: c linux gcc makefile raspberry-pi