1

単純なシェル システム用の最初の Makefile を作成しています。ライブラリ ファイルを作成する必要がありますが、何らかの理由でライブラリ セクションが機能しません。エラーメッセージには、ライブラリファイルが存在しないことが示されています(明らかに)。

これを修正できる明らかな何かが欠けていますか?また、この Makefile をより効率的にする方法はありますか?

# Beginning of Makefile

OBJS = obj/shutil.o obj/parser.o obj/sshell.o obj/history.o obj/hash_table.o obj/variables.o
HEADER_FILES = include/shell.h include/parser.h include/history.h include/hash_table.h include/variables.h
EXECUTABLE = sshell
LIBS = lib/libshell.so lib/libparser.so lib/libhistory.so lib/libhash_table.so lib/libvariables.so
LIBCFLAGS = $(CFLAGS) -D_REENTRANT -fPIC
CFLAGS = -Wall
CC = gcc
# End of configuration options

#What needs to be built to make all files and dependencies
all: $(EXECUTABLE)

#Create the main executable
$(EXECUTABLE): $(OBJS) $(LIBS)
    $(CC) -o $(EXECUTABLE) obj/sshell.o -Llib -lparser -lshell -lhistory -lhash_table -lvariables

#Create the library files
$(LIBS): $(OBJS)
    $(CC) $(LIBCFLAGS) -shared -o $(LIBS) $(OBJS)

#Recursively build object files
obj/%.o: src/%.c
    $(CC) $(CFLAGS) -I./include/ -c $< -o $@

#Define dependencies for objects based on header files
#We are overly conservative here, parser.o should depend on parser.h only
$(OBJS) : $(HEADER_FILES)

clean:
    -rm -f $(EXECUTABLE) obj/*.o lib/*.so lib/*.a
    -rm -f .sshell_history.txt

run: $(EXECUTABLE)
    (export LD_LIBRARY_PATH=lib; ./$(EXECUTABLE))

# End of Makefile

ありがとう!-リリー・バンクス

編集:

変更しようとする前に、ライブラリファイルに関して私が持っていたものを次に示します。

$(LIBS): $(OBJS)
    $(CC) -shared -o lib/libparser.a obj/parser.o
    $(CC) -shared -o lib/libshell.a obj/shutil.o
    $(CC) -shared -o lib/libhistory.a obj/history.o
    $(CC) -shared -o lib/libhash_table.a obj/hash_table.o
    $(CC) -shared -o lib/libvariables.a obj/variables.o

これの問題は、各ファイルを 5 回コンパイルすることであり、まったく効率的ではありません。だから私がやろうとしていたのは、すべてを一度に行うことでした。

編集2:

#Create the library files
lib/libparser.so: obj/parser.o
    $(CC) $(LIBFLAGS) -shared lib/libparser.a -o $@

lib/libshell.so: obj/shutil.o
    $(CC) $(LIBFLAGS) -shared lib/libshell.a -o $@

lib/libhistory.so: obj/history.o
    $(CC) $(LIBFLAGS) -shared lib/libhistory.a -o $@

lib/libhash_table.so: obj/hash_table.o
    $(CC) $(LIBFLAGS) -shared lib/libhash_table.a -o $@

lib/variables.so: obj/variables.o
    $(CC) $(LIBFLAGS) -shared lib/libvariables.a -o $@

残念ながら、ここに私が得ているエラーがあります:

make: *** No rule to make target `lib/libvariables.so', needed by `sshell'.  Stop.

考え?

編集3:

#Create the library files
lib/libparser.so: obj/parser.o
    $(CC) $(LIBFLAGS) -shared $^ -o lib/libparser.a

lib/libshell.so: obj/shutil.o
    $(CC) $(LIBFLAGS) -shared $^ -o lib/libshell.a

lib/libhistory.so: obj/history.o
    $(CC) $(LIBFLAGS) -shared $^ -o lib/libhistory.a

lib/libhash_table.so: obj/hash_table.o
    $(CC) $(LIBFLAGS) -shared $^ -o lib/libhash_table.a

lib/libvariables.so: obj/variables.o
    $(CC) $(LIBFLAGS) -shared $^ -o lib/libvariables.a

これは機能しますが、他に変更する必要があるものはありますか? ありがとう

4

2 に答える 2

2

この行は完全に間違っています:

$(LIBS): $(OBJS)
        $(CC) $(LIBCFLAGS) -shared -o $(LIBS) $(OBJS)

すべての変数を展開すると、この行は次のようになります (わかりやすくするために改行を追加しています)。

lib/libshell.so lib/libparser.so lib/libhistory.so lib/libhash_table.so lib/libvariables.so: \
            obj/shutil.o obj/parser.o   obj/sshell.o obj/history.o obj/hash_table.o obj/variables.o
        gcc -Wall -D_REENTRANT -fPIC -shared -o lib/libshell.so lib/libparser.so lib/libhistory.so \
            lib/libhash_table.so lib/libvariables.so obj/shutil.o obj/parser.o obj/sshell.o obj/history.o \
            obj/hash_table.o obj/variables.o

これは、明らかに正しくありません。あなたが何を達成しようとしているのか、私には本当にわかりません。.o各共有ライブラリには 1 つの.o. もしそうなら、なぜ.oファイルと共有ライブラリの両方を単一の実行可能ファイルにリンクしようとしているのですか?

あなたが本当にやろうとしていることをより高いレベルで説明していただければ、私たちがお手伝いできます。

于 2013-05-11T23:09:37.553 に答える
2

ライブラリごとに 1 セットのオブジェクト ファイルが必要です。また、-o フラグは、出力ファイルである引数を 1 つだけ取ります。gcc の 1 回の呼び出しでは実行できないすべてのライブラリ ファイルを出力しようとしています。

次のようなことをする必要があります:

lib/libshell.so: obj/sshell.o
    $(CC) $(LIBFLAGS) -shared obj/sshell.o -o lib/libshell.so

lib/libparser.so: obj/parser.o
    $(CC) $(LIBFLAGS) -shared obj/parser.o -o lib/libparser.so

ライブラリごとに。

于 2013-05-11T23:12:53.650 に答える