【问题标题】:GCC and Makefile (multiple declarations of a function, even with only one?)GCC 和 Makefile(一个函数的多个声明,即使只有一个?)
【发布时间】:2017-12-10 22:45:03
【问题描述】:

目前正在尝试在 Debian 上使用 GCC,以及一个 makefile,因为我正在制作我的头文件之一。每当我尝试“制作”makefile 时,都会收到如下错误:

setup.o:在函数“设置”中:

setup.c:(.text+0x0): `setup'的多重定义

finalkek.o:finalkek.c:(.text+0x0): 首先定义在这里

collect2: ld 返回 1 个退出状态

make: *** [projExec] 错误 1

我的 makefile 如下所示:

projExec: finalkek.o setup.o
    gcc -o projExec finalkek.o setup.o

finalkek.o: finalkek.c setup.h
    gcc -c finalkek.c

setup.o: setup.c
    gcc -c setup.c

finalkek.c 是我的主文件,setup 是我的头文件。

在我的主文件中,这是我唯一一次提到它:

include "setup.h" // Using the double quotes for a custom header...

void main()
{

setup();

       rest of code here...

}

在我的头文件setup.h中,我有这样的:

void setup()
{

      rest of code here...

}

【问题讨论】:

  • 为什么在setup.h 中实现setup() 函数? setup.c 中有什么内容? (是不是有些错字?)。您的问题可能是多次导入错误。如果您进行适当的修改,我们可以提供明确的答案。
  • 虽然和问题无关,但void main()应该是int main(void)。如果你有一本书或教程告诉你使用void main(),找一个作者懂C的更好的。
  • 另外,我从标题和标签中删除了“Debian”,因为它几乎肯定是不相关的。另外,请将所有代码(包括makefile)发布在帖子本身而不是截图
  • @KyrSt 可以,只需要从nano获取即可。
  • void setup() { 应该在 setup.c,而不是 setup.h

标签: c gcc makefile


【解决方案1】:

我注意到一些事情:虽然技术上允许,但在头文件中实现整个函数是有缺陷的做法。头文件仅用于原型(即void setup(void); 而不是整个void setup(void) { ... })。你的 setup.c 中有什么?此外,Make 不应该像这样工作。

finalkek.o: finalkek.c setup.h
    gcc -c finalkek.c

你不应该直接编译一个头文件,因为它不应该有实际的实现,只是原型。这就是预处理器所做的,使用指令#include,它获取指定标头的全部内容,并将其放在C 文件中。因此,通过告诉 Make 编译 setup.h,您会将该文件的内容包含在您的项目中两次,这可能会给您带来错误。

正如其他人所说,将函数setup() 的实际代码移至 setup.c,视情况而定。 setup.h 应该如下所示:

#ifndef SETUP_H
#define SETUP_H

void setup(void);

#endif

#ifndef SETUP_H, #define SETUP_H#endif 行是头文件的格式化工具,可防止您多次包含同一个文件。

然后是随附的 setup.c:

#include "setup.h"

void setup(void) {
    // your code here
}

finalkek.c:

int main(void) {
    setup();

    // rest of code here
}

【讨论】:

    猜你喜欢
    • 2019-12-28
    • 2013-10-13
    • 2021-11-28
    • 2016-09-26
    • 1970-01-01
    • 2011-06-26
    • 2012-10-28
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多