"多重定义","首先在这里定义"错误

时间:2015-06-13 17:10:46

标签: c eclipse include definition multiple-definition-error

我有3个项目:服务器客户端 Commons 。制作标题& Commons 中的源对不会导致任何问题,我可以从 Server Client 中自由访问这些函数。

但是,由于某些原因,在 Server Client 项目中创建其他源/头文件总是会导致multiple definition of (...)first defined here错误。

示例:

commands.h (在客户端项目的根目录中)

#ifndef COMMANDS_H_
#define COMMANDS_H_

#include "commands.c"

void f123();

#endif /* COMMANDS_H_ */

commands.c (在客户端项目的根目录中)

void f123(){

}

main.c (在客户端项目的根目录中)

#include "commands.h"
int main(int argc, char** argv){

}

错误:

make: *** [Client] Error 1      Client
first defined here              Client
multiple definition of `f123'   commands.c

清洁,重建索引,重建项目并没有帮助。也没有重新启动计算机。

5 个答案:

答案 0 :(得分:20)

这里的问题是您在函数原型之前将commands.c包含在commands.h中。因此,C预处理器在函数原型之前将commands.c的内容插入commands.hcommands.c包含函数定义。因此,函数定义在导致错误的函数声明之前结束。

预处理器阶段后commands.h的内容如下所示:

#ifndef COMMANDS_H_
#define COMMANDS_H_

// function definition
void f123(){

}

// function declaration
void f123();

#endif /* COMMANDS_H_ */

这是一个错误,因为你在C中定义后不能声明一个函数。如果交换了#include "commands.c"和函数声明,那么错误就不应该发生,因为现在,函数原型在函数声明之前。

但是,包含.c文件是不良做法,应避免使用。针对此问题的更好解决方案是在commands.h中包含commands.c,并将编译后的命令版本链接到主文件。例如:

<强> commands.h

#ifndef COMMANDS_H_
#define COMMANDS_H_

void f123(); // function declaration

#endif

<强> commands.c

#include "commands.h"

void f123(){} // function definition

答案 1 :(得分:4)

您不应在头文件中包含commands.c。通常,您不应包含.c文件。而是,commands.c应该包含commands.h。如此处所定义的,C预处理器将commands.c的内容插入到command.h中,其中include是。你最终在commands.h中有两个f123的定义。

<强> commands.h

#ifndef COMMANDS_H_
#define COMMANDS_H_

void f123();

#endif

<强> commands.c

#include "commands.h"

void f123()
{
    /* code */
}

答案 2 :(得分:1)

也许您多次在makefile中包含.c文件。

答案 3 :(得分:0)

我正在添加这个A因为我抓到了一个奇怪的版本,这让我抓了大约一个小时,直到我发现根本原因。由于此格式的多次重复,我的负载失败了

<path>/linit.o:(.rodata1.libs+0x50): multiple definition of `lua_lib_BASE'
<path>/linit.o:(.rodata1.libs+0x50): first defined here

我原来是我的Makefile魔法中的一个错误,我有一个C文件列表并使用vpath等,因此编译将从层次结构中的正确目录中选择它们。但是,在列表中重复了一个C文件,在一行的末尾和下一行的开头,因此make生成的gcc加载在命令行上有两次.o文件。 Durrrrh。多个定义来自同一文件的多个出现。链接器忽略了静态初始化器之外的重复项!

答案 4 :(得分:0)

在两个地方都没有使用inline作为全局函数时,我遇到了类似的问题。