获取错误符号 current_process 多重定义,对错误的含义和如何修复感到困惑?

Getting error Symbol current_process multiply defined, confused on what error means and how to fix?

我只是想编译我的代码,但我一直 运行 出错:

.\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.c3140_concur.h.

3140_concur.o 也是如此

其次,我不确定“多重定义”是什么意思。我认为这意味着我实例化了 current_process & process_queue 两次,但老实说我看不出是怎么做的,因为我只在 process.h 中“定义”了 current_processprocess_queue :

process_t * current_process; 
process_t * process_queue;

我什至不明白 lab4_t0.c 是如何定义 process_queue 的,所以我很困惑为什么会弹出这些“多重定义”的错误消息。

虽然,我有一种感觉,因为在 3140_concur.h 中我 #include "process.h" 并且在 process.h 中我定义了 process_queuecurrent_process 而且我也 #include "3140_concur.h"lab4_t0.c(我#include "process.h")也是如此。但我这样做的原因是 b/c process.c 使用来自 3140_concur.h 的方法并且 lab4_t0.c 使用来自 process.h.

的方法

因此,如果我的预感是正确的,这就是我遇到错误的原因,我该如何正确模块化我的代码(也就是我应该 #include 而不是 #include)以便我没有收到这些错误?

如果有人能输入我需要做的代码来消除这些错误,那就太好了!

注意:如果您想知道我为什么创建 process.h 以及为什么我不把所有内容都放在 process.h 中的 3140_concur.h 文件中,原因是它导致带有 lock.c 的错误,我不想进入此处。

我的代码的简要总结

lock.c

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

lock.h

#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.c

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

3140_concur.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.h

#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);

process.c

(我做 process_t* process_queue = NULL; & process_t* current_process = NULL; b/c 我希望它们在调用任何函数之前为 NULL)

#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;

lab4_t0.c

#include "process.h"
#include "utils.h"
#include "lock.h"

lock_t l;

如有任何帮助,我们将不胜感激!

extern 添加到我对 current_processprocess_queue 的定义中 process.h 删除了我的 "multiply defined" 错误(感谢@JonathanLeffler)

现在我遇到了另一个错误,但至少我解决了这个问题:)