C 未定义的符号,即使包含头文件?
当我试图编译我的代码时,我得到了错误:C 未定义的符号,即使包含头文件?,c,keil,C,Keil,当我试图编译我的代码时,我得到了错误: .\Objects\Lab4.axf: Error: L6218E: Undefined symbol l_init (referred from lab4_t0.o). .\Objects\Lab4.axf: Error: L6218E: Undefined symbol l_lock (referred from lab4_t0.o). .\Objects\Lab4.axf: Error: L6218E: Undefined symbol l_unlo
.\Objects\Lab4.axf: Error: L6218E: Undefined symbol l_init (referred from lab4_t0.o).
.\Objects\Lab4.axf: Error: L6218E: Undefined symbol l_lock (referred from lab4_t0.o).
.\Objects\Lab4.axf: Error: L6218E: Undefined symbol l_unlock (referred from lab4_t0.o).
我读到“声明函数时可能会出现未定义的符号错误(如lock.h
中的lock函数),但它没有正确实现。”但是我觉得我正在正确地实现lock.h
中的所有函数,因为所有函数都是void
类型,并且我不返回任何东西。所以我不知道我会做错什么来得到这个错误
任何帮助都将不胜感激
注意:如果需要提供更多代码,请告诉我。我不认为我需要写我在lock.h
的函数实现中放的东西,因为我觉得你需要知道的是函数实现没有返回任何东西,但是如果我需要包含它,请告诉我
代码
lock.c
#include "lock.h"
extern process_t * current_process;
extern process_t * process_queue;
void l_init(lock_t* l){
//Does stuff but never type return or return anything
}
void l_lock(lock_t* l){
//Does stuff but never type return or return anything
}
void l_unlock(lock_t* l){
//Does stuff but never type return or return anything
}
#include "3140_concur.h"
#include <stdlib.h>
#include "process.h"
#include "utils.h"
#include "lock.h"
lock_t l;
\\uses functions in lock.h
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 */
#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
#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);
extern process_t * current_process;
extern process_t * process_queue;
void process_start (void);
int process_create (void (*f)(void), int n);
3140_concur.c
#include "lock.h"
extern process_t * current_process;
extern process_t * process_queue;
void l_init(lock_t* l){
//Does stuff but never type return or return anything
}
void l_lock(lock_t* l){
//Does stuff but never type return or return anything
}
void l_unlock(lock_t* l){
//Does stuff but never type return or return anything
}
#include "3140_concur.h"
#include <stdlib.h>
#include "process.h"
#include "utils.h"
#include "lock.h"
lock_t l;
\\uses functions in lock.h
lab4_t0.c
#include "lock.h"
extern process_t * current_process;
extern process_t * process_queue;
void l_init(lock_t* l){
//Does stuff but never type return or return anything
}
void l_lock(lock_t* l){
//Does stuff but never type return or return anything
}
void l_unlock(lock_t* l){
//Does stuff but never type return or return anything
}
#include "3140_concur.h"
#include <stdlib.h>
#include "process.h"
#include "utils.h"
#include "lock.h"
lock_t l;
\\uses functions in lock.h
更新
构建输出
*** Using Compiler 'V5.06 update 4 (build 422)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
compiling 3140_concur.c...
compiling lab4_t0.c...
lab4_t0.c(42): warning: #111-D: statement is unreachable
return 0;
lab4_t0.c: 1 warning, 0 errors
compiling process.c...
process.c(100): warning: #1-D: last line of file ends without a newline
}
process.c: 1 warning, 0 errors
linking...
.\Objects\Lab4.axf: Error: L6218E: Undefined symbol l_init (referred from lab4_t0.o).
.\Objects\Lab4.axf: Error: L6218E: Undefined symbol l_lock (referred from lab4_t0.o).
.\Objects\Lab4.axf: Error: L6218E: Undefined symbol l_unlock (referred from lab4_t0.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 3 error messages.
".\Objects\Lab4.axf" - 3 Error(s), 2 Warning(s).
Target not created.
Build Time Elapsed: 00:00:39
多亏了@AjayBrahmakshatriya,我才没有在我的项目中添加lock.c
。一切都解决了。唷。多亏了@AjayBrahmakshatriya,我才发现我没有在我的项目中添加lock.c
。一切都解决了。Whew.头文件在链接器错误时通常不存在。您需要将库或对象文件指定给定义了所需符号的链接器。@oklas对不起,我不明白。你能详细说明一下我的代码需要做什么吗?@15ongm你能告诉我你是如何编译代码的吗?很可能您在链接时没有使用lock.o。最可能的副本是您的代码没有错误,也没有任何要在其术语中指定的内容。这是生成配置问题。头文件在链接器错误时通常不存在。您需要将库或对象文件指定给定义了所需符号的链接器。@oklas对不起,我不明白。你能详细说明一下我的代码需要做什么吗?@15ongm你能告诉我你是如何编译代码的吗?很可能您在链接时没有使用lock.o。最可能的副本是您的代码没有错误,也没有任何要在其术语中指定的内容。这是构建配置问题。