0

私は非常に大規模で厄介なプロジェクトに取り組んでおり、実際にクリーンアップする時間がなく、そのための API を提供する任務を負っています。私がやろうとしているのは、すべての醜いものを単一の静的ライブラリにラップしてから、単一のヘッダー ファイルを提供することです。

しかし、ヘッダー ファイルとライブラリを使用して実行可能ファイルをビルドしようとすると、一連の「未定義の参照」エラーが発生します。すべてのヘッダー ファイルを提供すればうまくいくと思いますが、実際にはこれを行う必要はありません。

現在、次のようにmakefile見えます (簡単にするために少し変更されています)。

myprog.elf : libgiant_lib.a main.o
    gcc -pg -o $@ main.o -lgiant_lib

main.o : main.c
    gcc -c $(CFLAGS) $(SOME_INCLUDES) $< -o $@

libgiant_lib.a : $(A_BUNCH_OF_LIBS) $(COUPLE_OF_OBJS) api.o
    ar rcs $@ $^

api.o : api.c api.h
    gcc -c $(CFLAGS) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o $@

アーカイブを確認したlibgiant_lib.aところ、必要なすべてのライブラリとオブジェクト ファイルが含まれているようです。それでも、それに対するリンクは機能しません。

ここで明らかな何かが欠けていると確信しています...

4

1 に答える 1

0

あなたのインクルード ファイルには、他のインクルード ファイルへの参照が含まれている可能性があります。そのため、これらのインクルード ファイルの場所を示すフラグを提供する必要があります。場所(すべてのインクルードファイルを含むディレクトリ)を次のように指定することをお勧めします

INCL_DIR=/include/dir/場所

-Iフラグを使用してコンパイルフェーズに含めます。たとえば、ルールは次のapi.oようになります

api.o: api.c api.h
        gcc -c $(CFLAGS) -I$(INCL_DIR) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o $@
于 2013-06-20T14:20:28.143 に答える