В настоящее время я пишу короткое тестовое приложение. Сборник дает мне эти ошибки:объект отсутствует файл функции
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, что дает правильное объявление и прототип.
Я думаю, что я делаю это неправильно, но у меня мало идей. Кроме того, мне очень не нравится, как я объявляю свою «стандартную» последовательность. Я знаю, что есть правильный способ сделать это, но я не могу вспомнить его ... У кого-то есть имя, чтобы помочь найти его?
Спасибо.
Кажется, что вы не строите и не связываетесь с этим 'cyclic_executive.o'file. Отредактируйте make-файл, чтобы распечатать значение 'OBJ' и убедитесь, что все в порядке. –