"Multiple definition"、"first defined here" 个错误
"Multiple definition", "first defined here" errors
我有 3 个项目:Server、Client 和 Commons。在 Commons 中制作 header 和来源对不会造成任何问题,我可以从 Server 和 客户.
但是,由于某些原因,在 Server 或 Client 项目中创建额外的 source/header 文件总是会导致 multiple definition of (...)
和 first defined here
个错误。
示例:
commands.h(在 Client 项目的根目录中)
#ifndef COMMANDS_H_
#define COMMANDS_H_
#include "commands.c"
void f123();
#endif /* COMMANDS_H_ */
commands.c(在 Client 项目的根目录中)
void f123(){
}
main.c(在 Client 项目的根目录中)
#include "commands.h"
int main(int argc, char** argv){
}
错误:
make: *** [Client] Error 1 Client
first defined here Client
multiple definition of `f123' commands.c
清理、重建索引、重建项目都没有帮助。重启电脑也不行。
您不应在头文件中包含 commands.c。通常,您不应包含 .c 文件。相反,commands.c 应该包括 commands.h。如此处所定义,C 预处理器将 commands.c 的内容插入包含所在的 commands.h 中。您最终在 commands.h.
中得到了 f123 的两个定义
commands.h
#ifndef COMMANDS_H_
#define COMMANDS_H_
void f123();
#endif
commands.c
#include "commands.h"
void f123()
{
/* code */
}
这里的问题是您在函数原型之前将 commands.c
包含在 commands.h
中。因此,C 预处理器将 commands.c
的内容插入函数原型之前的 commands.h
中。 commands.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
中,并将 link 编译后的命令版本添加到主文件中。例如:
commands.h
#ifndef COMMANDS_H_
#define COMMANDS_H_
void f123(); // function declaration
#endif
commands.c
#include "commands.h"
void f123(){} // function definition
可能您在 makefile 中多次包含了 .c
文件。
我添加这个 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
文件。嘟嘟。多个定义来自同一文件的多次出现。除了静态初始化器之外,链接器忽略了重复项!
当我的全局函数不使用 inline
时,我遇到了类似的问题,该函数包含在两个地方。
我有 3 个项目:Server、Client 和 Commons。在 Commons 中制作 header 和来源对不会造成任何问题,我可以从 Server 和 客户.
但是,由于某些原因,在 Server 或 Client 项目中创建额外的 source/header 文件总是会导致 multiple definition of (...)
和 first defined here
个错误。
示例:
commands.h(在 Client 项目的根目录中)
#ifndef COMMANDS_H_
#define COMMANDS_H_
#include "commands.c"
void f123();
#endif /* COMMANDS_H_ */
commands.c(在 Client 项目的根目录中)
void f123(){
}
main.c(在 Client 项目的根目录中)
#include "commands.h"
int main(int argc, char** argv){
}
错误:
make: *** [Client] Error 1 Client
first defined here Client
multiple definition of `f123' commands.c
清理、重建索引、重建项目都没有帮助。重启电脑也不行。
您不应在头文件中包含 commands.c。通常,您不应包含 .c 文件。相反,commands.c 应该包括 commands.h。如此处所定义,C 预处理器将 commands.c 的内容插入包含所在的 commands.h 中。您最终在 commands.h.
中得到了 f123 的两个定义commands.h
#ifndef COMMANDS_H_
#define COMMANDS_H_
void f123();
#endif
commands.c
#include "commands.h"
void f123()
{
/* code */
}
这里的问题是您在函数原型之前将 commands.c
包含在 commands.h
中。因此,C 预处理器将 commands.c
的内容插入函数原型之前的 commands.h
中。 commands.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
中,并将 link 编译后的命令版本添加到主文件中。例如:
commands.h
#ifndef COMMANDS_H_
#define COMMANDS_H_
void f123(); // function declaration
#endif
commands.c
#include "commands.h"
void f123(){} // function definition
可能您在 makefile 中多次包含了 .c
文件。
我添加这个 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
文件。嘟嘟。多个定义来自同一文件的多次出现。除了静态初始化器之外,链接器忽略了重复项!
当我的全局函数不使用 inline
时,我遇到了类似的问题,该函数包含在两个地方。