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);

関数は現在、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 を使用して全体をリンクしようとします。アイデアを提供する1つのメイクファイルを次に示します。

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

したがって、私はこれの初心者であり、これが私の理解です。使用中の関数のシンボルが main.o にありませんが、それは cyclic_executive.o ファイルに存在します。cyclic_executive.h ファイルを含めて、適切な宣言とプロトタイプを提供するため、これがどのように可能かわかりません。

私はそれを間違っていると思いますが、アイデアが不足しています。また、「デフォルト」シーケンスを宣言する方法が本当に嫌いです。適切な方法があることは知っていますが、思い出せません... 誰かがそれを検索するのに役立つ名前を持っていますか?

ありがとう。

4

1 に答える 1

1

busy()ファイルを関数呼び出しにリンクしていません。

コマンドラインからこれを試してください:

gcc main.c cyclic_executive.c

それが機能する場合、または少なくともbusy()関数でエラーが発生しない場合は、問題が確認されます。それから試してください

make all

これにより、実行されるすべてのコマンドが出力されます。まだ暗い場合は、試してみてください

make -d

これにより、make が実際に何を行っているかについて、大量の診断情報が得られます。

于 2012-06-14T10:58:46.290 に答える