获取错误符号 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.c
和 3140_concur.h
.
的 3140_concur.o
也是如此
其次,我不确定“多重定义”是什么意思。我认为这意味着我实例化了 current_process
& process_queue
两次,但老实说我看不出是怎么做的,因为我只在 process.h
中“定义”了 current_process
和 process_queue
:
process_t * current_process;
process_t * process_queue;
我什至不明白 lab4_t0.c
是如何定义 process_queue
的,所以我很困惑为什么会弹出这些“多重定义”的错误消息。
虽然,我有一种感觉,因为在 3140_concur.h
中我 #include "process.h"
并且在 process.h
中我定义了 process_queue
和 current_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_process
和 process_queue
的定义中 process.h
删除了我的 "multiply defined" 错误(感谢@JonathanLeffler)
现在我遇到了另一个错误,但至少我解决了这个问题:)
我只是想编译我的代码,但我一直 运行 出错:
.\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.c
和 3140_concur.h
.
3140_concur.o
也是如此
其次,我不确定“多重定义”是什么意思。我认为这意味着我实例化了 current_process
& process_queue
两次,但老实说我看不出是怎么做的,因为我只在 process.h
中“定义”了 current_process
和 process_queue
:
process_t * current_process;
process_t * process_queue;
我什至不明白 lab4_t0.c
是如何定义 process_queue
的,所以我很困惑为什么会弹出这些“多重定义”的错误消息。
虽然,我有一种感觉,因为在 3140_concur.h
中我 #include "process.h"
并且在 process.h
中我定义了 process_queue
和 current_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_process
和 process_queue
的定义中 process.h
删除了我的 "multiply defined" 错误(感谢@JonathanLeffler)
现在我遇到了另一个错误,但至少我解决了这个问题:)