【问题标题】:Undefined symbol even when include header file?即使包含头文件也未定义符号?
【发布时间】:2017-04-12 04:02:42
【问题描述】:

当我尝试编译我的代码时,我收到了错误:

.\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.h 中的所有功能,因为所有功能都是void 类型,而我没有return 任何东西。所以我不知道我做错了什么才能得到这个错误。

任何帮助将不胜感激!

注意:如果我需要提供更多代码,请告诉我。我认为我不需要写我在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
}

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

extern process_t * current_process; 
extern process_t * process_queue;

void process_start (void);

int process_create (void (*f)(void), int n);

process.c

(我确实 process_t* process_queue = NULL; &amp; 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;

\\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

【问题讨论】:

  • 头文件大多不会出现链接器错误。您需要将库或目标文件指定给定义所需符号的链接器。
  • @oklas 对不起,我不明白。您能否根据我的代码指定我需要做什么?
  • @15ongm 你能展示一下你是如何编译代码的吗?很可能您在链接时没有使用 lock.o。
  • 您的代码很可能没有错误,也没有什么可指定的。这是构建配置问题。

标签: c keil


【解决方案1】:

感谢@AjayBrahmakshatriya,事实证明我没有将lock.c 添加到我的项目中。这解决了一切。呼。

【讨论】:

  • 这个决议让我很开心!
猜你喜欢
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多