Question

I am currently writing a short test app. The compilation gives me these errors :

CC main.c
Building ../bin/pmono
./main.o:(.data+0x18): undefined reference to `busy'
./main.o:(.data+0x58): undefined reference to `busy'
./main.o:(.data+0x98): undefined reference to `busy'
./main.o:(.data+0xd8): undefined reference to `busy'
./main.o:(.data+0x118): undefined reference to `busy'
./main.o:(.data+0x158): more undefined references to `busy' follow
collect2: ld a retourné 1 code d'état d'exécution

I will try to narrow the code down to the specific parts.

Here is a structure I use which contain the desired reference :

/*
 * Chained list of blocks from a frame of the cyclic executive
 */
typedef struct block {
   long c;                    /* Worst case execution time */
   long d;                    /* Deadline */
   long p;                    /* Period */
   void (*action) (long);       /* Action performed by this frame */
   struct block * next;       
} *Frame;

The function pointer is placeholder for a generic function not written yet, declared as such in the same .h file :

/*
 * Load the CPU for a determined time expressed in nanosecond
 */
void busy(long t);

The function is currently hollow in the c file :

void busy(long t) {
}

Finally, here is a sample default structure I use in my tests :

struct block D = {8,20,20,busy,0};
struct block C = {2,20,20,busy,&D};
struct block B = {3,10,10,busy,&C};
struct block A = {1,10,10,busy,&B};
Frame sequence0 = &A;

All of these parts are contained in a common source file shared between numerous implementations of periodic tasks. The compilation of the object file seems fine. When I try to compile a given implementation, I first include the .h file, compile the .o file, then try to link the whole thing, using makefile. Here is one makefile to give you an idea :

BIN = ../bin/pmono
CC = gcc

SUBDIR = .
SRC = $(foreach dir, $(SUBDIR), $(wildcard $(dir)/*.c))
OBJ = $(SRC:.c=.o) $(wildcard ../common/*.o)
INCLUDES = 
WARNINGS = 
OPTIMISATION =
DEBUG =

XENO_CONFIG = /usr/xenomai/bin/xeno-config
XENO_POSIX_CFLAGS = $(shell $(XENO_CONFIG) --skin=posix --cflags)
XENO_POSIX_LDFLAGS = $(shell $(XENO_CONFIG) --skin=posix --ldflags)

CFLAGS = $(INCLUDES) $(XENO_POSIX_CFLAGS) $(WARNINGS) $(OPTIMISATION)
LDFLAGS = -lm $(XENO_POSIX_LDFLAGS) $(DEBUG)

all:.depend $(BIN)

%.o:%.c
    @echo "CC $<"
    @$(CC) -c $(CFLAGS) $< -o $@

$(BIN): $(OBJ)
    @echo "Building ${BIN}"
    @$(CC) $(OBJ) -o $@ $(LDFLAGS)

clean:
    rm -f $(OBJ)

distclean: clean
    rm -f $(BIN)
    rm -f ./.depend

.depend: $(SRC)
    @echo "Génération des dépendances"
    @$(CC) $(CFLAGS) -MM $(SRC) > .depend

-include .depend

So, I'm a beginner in this, and this is my understanding : the symbol of the busy function is missing in the main.o, while it exists in the cyclic_executive.o file. I don't understand how this is possible, as I include the cyclic_executive.h file, thus giving the proper declaration and prototype.

I think I'm doing it wrong, but I'm short on idea. Also, I really dislike how I declare my "default" sequence. I know there is a proper way to do it, but I can't recall it... Does someone has a name to help search for it ?

Thanks.

Était-ce utile?

La solution

You are not linking the file with the busy() function call.

Try this from the command line:

gcc main.c cyclic_executive.c

If it works, or at least doesn't give errors on the busy() function, that will confirm the issue. Then try

make all

This should print all the commands as they are executed. If you are still in the dark, try

make -d

That will give you a ton of diagnostics about what make is actually doing.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top