获取错误符号current_process被多重定义,混淆了什么错误意味着什么以及如何修复?

时间:2017-04-12 03:26:59

标签: c keil

我只是想让我的代码编译,但我一直遇到错误:

.\Objects\Lab4.axf: Error: L6200E: Symbol current_process multiply defined (by lab4_t0.o and 3140_concur.o).
.\Objects\Lab4.axf: Error: L6200E: Symbol current_process multiply defined (by process.o and 3140_concur.o).
.\Objects\Lab4.axf: Error: L6200E: Symbol process_queue multiply defined (by lab4_t0.o and 3140_concur.o).
.\Objects\Lab4.axf: Error: L6200E: Symbol process_queue multiply defined (by process.o and 3140_concur.o).

我真的不明白错误信息。

首先,我不确定process.o是指process.h还是process.c(因此我不知道要关注哪个文件)。具有3140_concur.o3140_concur.c的{​​{1}}也是如此。

其次,我不确定“多重定义”是什么意思。我想这意味着我实例化了3140_concur.h& current_process两次,但老实说我看不清楚是怎么回事,因为我只在process_queue中“定义”current_processprocess_queue

process.h

我甚至不知道process_t * current_process; process_t * process_queue; 如何定义lab4_t0.c,所以我很困惑为什么会出现这些“多重定义”的错误消息。

尽管如此,我有一种感觉,因为在process_queue3140_concur.h#include "process.h"我定义了process.hprocess_queue我也current_process }。同样适用于#include "3140_concur.h"(I lab4_t0.c)。但我这样做的原因是b / c #include "process.h"使用process.c中的方法,3140_concur.h使用来自lab4_t0.c的方法。

因此,如果我的预感是正确的,这就是我收到错误的原因,我怎样才能正确地模块化我的代码(又名我应该process.h而不是#include),这样我就不会得到这些错误?

如果有人可以输入我需要做的代码来删除这些错误,那就太棒了!

注意:如果您想知道我为什么创建#include以及为什么我不将process.h中的所有内容都放在process.h文件中,原因是它导致错误w / 3140_concur.h我不想进入这里。

我的代码简要总结

lock.c

lock.c

lock.h

#include "lock.h"
extern process_t * current_process; 
extern process_t * process_queue;

3140_concur.c

#ifndef __LOCK_H_INCLUDED__
#define __LOCK_H_INCLUDED__
#include "3140_concur.h"
#include "shared_structs.h"
void l_init(lock_t* l);
void l_lock(lock_t* l);
void l_unlock(lock_t* l);
#endif /* __LOCK_H_INCLUDED */

3140_concur.h

#include "3140_concur.h"
#include <stdlib.h>

process.h

#ifndef __3140_CONCUR_H__
#define __3140_CONCUR_H__

#include <stdlib.h>
#include <fsl_device_registers.h>
#include "process.h"

void process_blocked (void);

void process_terminated (void);

unsigned int * process_stack_init (void (*f)(void), int n);

void process_stack_free (unsigned int *sp, int n);

void process_begin (void);

#endif

process.c

(我做#include <stdlib.h> #include <fsl_device_registers.h> #include "3140_concur.h" struct process_state; typedef struct process_state process_t; unsigned int * process_select (unsigned int * cursp); process_t * current_process; process_t * process_queue; void process_start (void); int process_create (void (*f)(void), int n); b / c我希望在调用任何函数之前它们为NULL)

process_t* process_queue = NULL; & process_t* current_process = NULL;

lab4_t0.c

#include "3140_concur.h" 
#include "shared_structs.h"
#include <stdlib.h> 
#include <fsl_device_registers.h>

process_t* process_queue = NULL;
process_t* current_process = NULL;

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

extern添加到我current_processprocess_queueprocess.h的定义中删除了我的“多重定义”错误(感谢@JonathanLeffler)

现在我得到了一个不同的错误,但至少我解决了这个问题:)