2012-06-14 3 views
0

В настоящее время я пишу короткое тестовое приложение. Сборник дает мне эти ошибки:объект отсутствует файл функции

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 

Я буду стараться, чтобы сузить код вплоть до конкретных деталей.

Вот структура я использую, которые содержат нужную ссылку:

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

Указатель функция заполнитель для родовой функции еще не записано, объявлены в качестве таковых в том же самом файле .h:

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

функция находится в дупле с-файла:

void busy(long t) { 
} 

И, наконец, вот структура выборки по умолчанию я использую в моих тестах:

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; 

Все эти части содержатся в едином исходном файле разделяемого между многочисленными реализациями периодических задач. Компиляция объектного файла кажется прекрасной. Когда я пытаюсь скомпилировать данную реализацию, я сначала включаю файл .h, компилирую файл .o, а затем пытаюсь связать все это, используя makefile. Вот один Makefile, чтобы дать вам идею:

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 [email protected] 

$(BIN): $(OBJ) 
    @echo "Building ${BIN}" 
    @$(CC) $(OBJ) -o [email protected] $(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 

Итак, я новичок в этом, и это мое понимание: символ шумной функции отсутствует в main.o, в то время как она существует в файле cyclic_executive.o. Я не понимаю, как это возможно, поскольку я включаю файл cyclic_executive.h, что дает правильное объявление и прототип.

Я думаю, что я делаю это неправильно, но у меня мало идей. Кроме того, мне очень не нравится, как я объявляю свою «стандартную» последовательность. Я знаю, что есть правильный способ сделать это, но я не могу вспомнить его ... У кого-то есть имя, чтобы помочь найти его?

Спасибо.

+0

Кажется, что вы не строите и не связываетесь с этим 'cyclic_executive.o'file. Отредактируйте make-файл, чтобы распечатать значение 'OBJ' и убедитесь, что все в порядке. –

ответ

1

Вы не связываете файл с вызовом функции busy().

Попробуйте это из командной строки:

gcc main.c cyclic_executive.c 

Если он работает, или, по крайней мере, не дает ошибки в функции busy(), что подтвердит этот вопрос. Затем попробуйте

make all 

Это должно печатать все команды по мере их выполнения. Если вы все еще в темноте, попробуйте

make -d 

Это даст вам массу диагностики о том, что делать на самом деле делает.

+0

Действительно, связи не было сделано. Вот что я сделал: Включает ../ common directory в SUBDIR Удалено из объекта Таким образом, он построен в то же время, что main.o построен, а остальная часть Makefile будет выполнять связь. У меня есть новая ошибка с несколькими объявлениями одной и той же переменной (Frame sequence0 и т. Д.). Я думаю, что это уродливо, но я просто определил их как статичные. У меня есть последнее предупреждение, так как они не используются в области cyclic_executive.c, но сейчас у меня есть другая вещь. Спасибо! – 0xeedfade

Смежные вопросы