C 对象文件缺少函数符号

C 对象文件缺少函数符号,c,linker,makefile,function-pointers,xenomai,C,Linker,Makefile,Function Pointers,Xenomai,我目前正在编写一个简短的测试应用程序。 汇编给了我以下错误: 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): undef

我目前正在编写一个简短的测试应用程序。 汇编给了我以下错误:

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);
该函数当前在c文件中为空:

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 $@

$(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
BIN=../BIN/pmono
CC=gcc
细分利率=。
SRC=$(foreach dir,$(SUBDIR),$(通配符$(dir)/*.c))
OBJ=$(SRC:.c=.o)$(通配符../common/*.o)
包括=
警告=
优化=
调试=
XENO_配置=/usr/xenomai/bin/XENO配置
XENO_POSIX_CFLAGS=$(shell$(XENO_配置)--皮肤=POSIX--CFLAGS)
XENO_POSIX_LDFLAGS=$(外壳$(XENO_配置)--皮肤=POSIX--LDFLAGS)
CFLAGS=$(包括)$(XENO_POSIX_CFLAGS)$(警告)$(优化)
LDFLAGS=-lm$(XENO_POSIX_LDFLAGS)$(调试)
全部:$(BIN)
%.o:%.c

@echo“CC$您没有使用
busy()
函数调用链接文件

请从命令行尝试以下操作:

gcc main.c cyclic_executive.c
如果它工作正常,或者至少在
busy()
函数中没有给出错误,那么将确认问题。然后重试

make all
这将在执行命令时打印所有命令。如果您仍然不清楚,请尝试

make -d

这将为您提供大量有关make实际操作的诊断信息。

您似乎没有使用此
cyclic_executive.o
文件进行构建和链接。编辑make文件以打印出
OBJ
的值,并确保其正常。确实没有完成任何链接。以下是我所做的:包括../common子目录中的子目录将其从对象中删除,这样它就可以在生成main.o的同时生成,而Makefile的其余部分将进行链接。我发现了一个新错误,即同一变量的多个声明(Frame sequence0等).我认为这很难看,但我只是将它们定义为静态。我有最后一个警告,因为它们不用于cyclic_executive.c范围,但我现在还有其他事情要处理。谢谢!