14wml
14wml

Reputation: 4166

Undefined symbol even when include header file?

When I try to compile my code, I'm getting the error:

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

I read that "Undefined symbol errors can occur when a function is declared (as is the case for the lock functions in lock.h), but it is not properly implemented." But I feel that I am implementing all the functions in lock.h properly since all the functions are of type voidand I don't return anything. So I don't know what I could be doing wrong to get this error.

Any help would greatly be appreciated!

Note: Please let me know if I need to provide more code. I don't think I need to write what I put in the function implementations of lock.h since I feel all you need to know is that the function implementations do not return anything, but please let me know if I need to include that.

Code

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

(I do process_t* process_queue = NULL; & process_t* current_process = NULL; b/c I want them to be NULL before any functions are called)

#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

Update

Build output

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

Upvotes: 1

Views: 4128

Answers (1)

14wml
14wml

Reputation: 4166

Thanks to @AjayBrahmakshatriya, it turns out I didn't add lock.c to my project. That fixed everything. Whew.

Upvotes: 1

Related Questions