web-dev-qa-db-ja.com

C:Makefileを使用した静的ライブラリの作成とリンク

静的ライブラリと共有ライブラリを理解する を試みています。

静的ライブラリが作成され、最終的な静的実行可能ファイルを形成する際にリンクされるように、コンパイルとリンクを分離するメイクファイルを作成するために次のことを行いたいと思います。

Makefileには次のコードがありますが、次のエラーが表示されます

Makefile:13: *** missing separator. Stop.

しかし、実際にライブラリをリンク/作成する方法を理解しようとしています。

端末でline 12の後にコマンドを実行すると、コマンドは動作しますが、メイクファイルでは動作しません。

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o

main.o: main.c
    gcc -O -c -lm main.c main.h

addSorted.o: addSorted.c addSorted.h
    gcc -O -c -lm addSorted.c

freeLinks.o: freeLinks.c freeLinks.h
    gcc -O -c -lm freeLinks.c

ar rc libmylib.a main.o addSorted.o freeLinks.o    //Error Line

ranlib libmylib.a

gcc -o foo -L. -lmylib foo.o

clean:
    rm -f myProgram main.o addSorted.o freeLinks.o

また、コードの改善にご協力いただければ、本当にありがたいです。

15
user3337714

これを試して:

all: myProgram

myProgram: main.o libmylib.a #libmylib.a is the dependency for the executable
        gcc -lm -o myProgram main.o -L. -lmylib

main.o: main.c
        gcc -O -c main.c main.h

addSorted.o: addSorted.c addSorted.h
        gcc -O -c addSorted.c

freeLinks.o: freeLinks.c freeLinks.h
        gcc -O -c freeLinks.c

libmylib.a: addSorted.o freeLinks.o #let's link library files into a static library
        ar rcs libmylib.a addSorted.o freeLinks.o

libs: libmylib.a

clean:
        rm -f myProgram *.o *.a *.gch #This way is cleaner than your clean

この一連のルールは、最初にすべてのファイルをコンパイルしてから、ライブラリ(libmylib.a)をターゲットにし、その成果物を使用して実行可能ファイルをリンクします。また、ライブラリのみを作成する別の冗長ターゲットフォームを追加しました。必要なファイル:

user@Host> ls
addSorted.c  addSorted.h  freeLinks.c  freeLinks.h  main.c  main.h Makefile
19
Sergey

メイクファイルはシェルスクリプトではありません。これは、エキスパートシステムの構成ファイルです。具体的に言うと、再構成する必要のない最小限の再作成ファイルで、ファイルとその依存関係を効率的に作成する方法を知っているエキスパートシステム。

あなたが持っている最初のルールを見ると:

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o

これは、システムに「myProgram」というファイルを作成する必要があると判断した場合に、その作成方法を指示します。コロンの後の部分は、myProgramが必要とするファイルです。それらが存在しない場合、またはmakeが古いと判断した場合、makeはそれらを作成または更新するために使用できるレシピを見つけようとします。すべてが完了したら、makeは「gcc ...」行を実行し、myProgramが作成または更新されると想定します。

持っているarおよびranlib行は、メイクファイルルールに必要な構文と一致しません。それらの外観から、それらはlibmylib.aを作成するためのレシピのように見えます。それらを構文に入れると、makeはそれを言う必要があります:

libmylib.a: main.o addSorted.o freeLinks.o
    ar rcu libmylib.a main.o addSorted.o freeLinks.o
    ranlib libmylib.a

myProgramは、ライブラリの内容ではなく、ライブラリ自体に依存する必要があり、ライブラリオプションを最後に配置するのが最善です。

myProgram: libmylib.a
    gcc -o myProgram libmylib.a -lm

必要に応じて、現在のディレクトリでライブラリを探すようにgccに指示するオプションを使用できます。

gcc -L. -o myProgram main.o -lmylib -lm

また、それほど繰り返す必要のないメイクファイル変数があるため、最初のルールを次のように記述します。

myProgram: libmylib.a
    gcc -L. -o $@ -lmylib -lm

ただし、main.oが実際にライブラリの一部である可能性は低いため、次のようになります。

myProgram: main.o libmylib.a
    gcc -L. -o $@ $< -lmylib -lm

また、ライブラリルールは次のとおりです。

libmylib.a: addSorted.o freeLinks.o
    ar rcu $@ $+
    ranlib $@

ここでの$ +は「すべての依存ファイル名」を意味します。

最後に、作成したライブラリを使用するだけでなく、gccで実際の静的実行可能ファイルを作成する場合は、 '-static'オプションをgccに渡す必要があります。

5
user464502