LNK2005 在 .c 文件中包含 .h 文件时发生
LNK2005 happen when include .h file in .c file
我正在尝试使用 C 语言在程序中实现堆栈。我将它们分成 3 个文件。
首先,stack.h 文件。它包括一些基本的声明和函数,例如堆栈的 Pop、Push。
第二,stack.c 文件。它是一个实现 stack.h 文件中功能的文件。就我而言,我使用动态数组实现我的堆栈。
三、main.c文件。这是我使用 Stack 进行一些计算的地方。
但是,最后我得到 LNK2005(...already defined in ...obj) 编译错误。我知道当存在多次定义时会发生此错误。但是,我在 .h/.c 文件中看到许多具有相同函数名称的示例,但没有导致错误。
这是错误日志:
LNK1169 one or more multiply defined symbols found
LNK2005 _CreateStack already defined in main.obj
LNK2005 _IsEmpty already defined in main.obj
LNK2005 _Pop already defined in main.obj
LNK2005 _Push already defined in main.obj
LNK2005 _StackDepth already defined in main.obj
感谢您的关注。
这是我的 stack.h 文件。
typedef struct Stack Stack;
Stack* CreateStack();
void Push(Stack *s, char InputString);
void Pop(Stack *s);
int StackDepth(Stack *s);
int IsEmpty(Stack *s);
这是我的 stack.c 文件。
#include "stack.h"
typedef struct Stack{
.....
.....
}
Stack* CreateStack(){
......
};
void Push(Stack *s, char InputString){
....
....
}
void Pop(Stack *s){
....
};
int StackDepth(Stack *s){
....
};
int IsEmpty(Stack *s){
....
};
这是我的 main.c 文件
#include<stdio.h>
#include"stack.c"
#include"stack.h"
int main(){
....
....
....
return 0;
}
您已将 C 文件包含在主文件中。
#include
指令告诉预处理器以文本方式将指定文件的全部内容粘贴到 #include
指令所在的位置。这意味着来自 stack.c
文件的函数实现现在被编译为 stack.c
文件和 main.c
文件的一部分 - 正如链接器告诉您的那样,实现了两次。
编译器无法处理歧义 - 如果一个调用有 2 个匹配函数,它 returns 一个错误而不是随机选择其中一个。
你不应该 #include
C 文件,只有头文件 (.h)。
我正在尝试使用 C 语言在程序中实现堆栈。我将它们分成 3 个文件。
首先,stack.h 文件。它包括一些基本的声明和函数,例如堆栈的 Pop、Push。 第二,stack.c 文件。它是一个实现 stack.h 文件中功能的文件。就我而言,我使用动态数组实现我的堆栈。 三、main.c文件。这是我使用 Stack 进行一些计算的地方。
但是,最后我得到 LNK2005(...already defined in ...obj) 编译错误。我知道当存在多次定义时会发生此错误。但是,我在 .h/.c 文件中看到许多具有相同函数名称的示例,但没有导致错误。
这是错误日志:
LNK1169 one or more multiply defined symbols found
LNK2005 _CreateStack already defined in main.obj
LNK2005 _IsEmpty already defined in main.obj
LNK2005 _Pop already defined in main.obj
LNK2005 _Push already defined in main.obj
LNK2005 _StackDepth already defined in main.obj
感谢您的关注。 这是我的 stack.h 文件。
typedef struct Stack Stack;
Stack* CreateStack();
void Push(Stack *s, char InputString);
void Pop(Stack *s);
int StackDepth(Stack *s);
int IsEmpty(Stack *s);
这是我的 stack.c 文件。
#include "stack.h"
typedef struct Stack{
.....
.....
}
Stack* CreateStack(){
......
};
void Push(Stack *s, char InputString){
....
....
}
void Pop(Stack *s){
....
};
int StackDepth(Stack *s){
....
};
int IsEmpty(Stack *s){
....
};
这是我的 main.c 文件
#include<stdio.h>
#include"stack.c"
#include"stack.h"
int main(){
....
....
....
return 0;
}
您已将 C 文件包含在主文件中。
#include
指令告诉预处理器以文本方式将指定文件的全部内容粘贴到 #include
指令所在的位置。这意味着来自 stack.c
文件的函数实现现在被编译为 stack.c
文件和 main.c
文件的一部分 - 正如链接器告诉您的那样,实现了两次。
编译器无法处理歧义 - 如果一个调用有 2 个匹配函数,它 returns 一个错误而不是随机选择其中一个。
你不应该 #include
C 文件,只有头文件 (.h)。