web-dev-qa-db-ja.com

MakefileからUNIXの静的/動的ライブラリまでのプロジェクトの作成

皆さん、UNIXでのc ++ビルディングブロックについていくつか説明していただけますか。

静的ライブラリと動的ライブラリ(.so)に対してリンクするアプリケーションを作成したいと思います。

質問1:gcc/g ++を使用して静的ライブラリを作成するにはどうすればよいですか?それに対してアプリをリンクするにはどうすればよいですか?

質問2:両方のライブラリにヘッダーファイルがあると仮定して、静的および動的ライブラリに対してリンクし、メイクファイルでそれを指定する方法

概要:私は何年もの間、他の誰かによって書かれたメイクファイルとライブラリを使用しています。したがって、変更するたびに、実際には理解せずに、単に切り取って貼り付けました。ここで、地面に降りて、Makfileの構築/リンク/作成プロセスを詳細に理解したいと思います。

これらの概念を詳細に説明している良い本は何ですか?

ありがとう

17
Sasha

静的ライブラリは通常archivedarコマンドを使用します。すべてのオブジェクトファイルをビルドしたら(できればGCCの-fPICスイッチを使用して)、次のようにarを実行できます。

ar -rs archivename.a list.o of.o objects.o

manページでオプションについて説明します。

ダイナミックライブラリは通常、-sharedgccまたはldに切り替え、出力ファイル名に.so拡張子を付けて構築されます。

Autotoolsはこれをlibtoolプログラムで処理します。私はその使用法に精通していません。

これらのライブラリに対するリンクは、-l(ell)スイッチを使用してライブラリを一覧表示するか(-lXにリンクするlibX.soなど)、絶対パスを使用して直接指定する(など)ことによって実行できます。コマンドに/usr/lib/libX.soを追加するように)。静的ライブラリは、-staticの前に-lを指定するか、.aアーカイブへの適切な絶対パスを指定することによってリンクされます。

15
greyfade

Foo.cpp、bar.cppのコードで構成される静的ライブラリを作成するためのベアボーンMakefile:

PROJECT = library.a
OBJECTS = foo.o bar.o
CFLAGS  = -Wall -pedantic

all: $(PROJECT)

.cpp.o:
        g++ -c $(CFLAGS) $<

$(PROJECT): $(OBJECTS)
        libtool -o $(PROJECT) -static $(OBJECTS)

Library.aに静的にリンクするアプリbaz.cppのベアボーンMakefile:

PROJECT = baz
CFLAGS  = -Wall -pedantic
OBJECTS = baz.o

all: $(PROJECT)

.cpp.o:
        g++ -c $(CFLAGS) $<

$(PROJECT): $(OBJECTS) library.a
        g++ $(OBJECTS) -L. -llibrary -o $(PROJECT)

読者への演習として、ダイナミックライブラリが残っています。

11
Paul Beckingham

回答1:ソースファイルfoo.cおよびbar.cから静的ライブラリを作成するには、次のようにします。

gcc -c foo.c
gcc -c bar.c
ar rc mylibrary.a foo.o bar.o

これについての詳細は、 GCCマニュアル マニュアルを読んで、コンパイラーの使用方法と、コンパイラーを介したリンカーについて学習してください。 binutils manual も役立つはずです。

回答2: GNU Make manual はかなり良いです。ライブラリとその動作について実際に学ぶには、John R. LevineによるLinkers and Loaders本を読んでください。

静的ライブラリは非常に単純ですが、プラットフォームや必要な移植性の量によっては、共有ライブラリが非常に複雑になる可能性があります。例として、一部のシステムでは、静的ライブラリと共有ライブラリを適切に機能させるために異なるオプションでコンパイルする必要があります(一方は位置に依存しないコードでコンパイルする必要があり、もう一方はコンパイルしないでください)。これを簡単にするためにユーティリティのフレームワーク全体が開発されましたが(libtool)、それ自体は問題ありません。

2
user25148

Gccを参照しているので、GNU Makeを使用していると思います。私が見つけた最高のドキュメントは 公式マニュアル で、必要なものすべてを網羅しています。わかりやすい言葉で知ること。

0
Christoffer

Linuxプログラミングについて学んでいたとき、 Advanced Linux Programming は私を大いに助けてくれました。 this pdf の「ライブラリの作成と使用」セクションを確認できます。 Linuxのライブラリについてかなり説明しています。

0
aks