g ++で静的ライブラリを作成する方法は?


101

誰かが.cppと.hppファイルから静的ライブラリを作成する方法を教えてもらえますか?.oと.aを作成する必要がありますか?また、静的ライブラリをコンパイルして他の.cppコードで使用する方法を教えてください。持っていますheader.cppheader.hpp .作りたいheader.aです。でheader.aをテストしtest.cppます。コンパイルにg ++を使用しています。


3
@NeilButterworthの回答(または別の回答)を受け入れてもらえますか?
einpoklum

回答:


110

.oファイルを作成します。

g++ -c header.cpp

このファイルをライブラリに追加し、必要に応じてライブラリを作成します。

ar rvs header.a header.o

ライブラリを使用:

g++ main.cpp header.a

3
g ++ test.cpp header.a -o test、no?
Linuxx

11
@unapersson:なぜですか?実行可能ファイルはありませんa.out、これは非常に誤解を招くようなフォーマット。そして、なぜあなたはと呼ばれる実行可能ファイルを「決して」作成すべきではないのtestですか?
オービットの軽量レース、

5
@Tomalak Geret'kal:これはtestシステムコマンドであるという事実に関係していると思います。しかし、テストプログラムは通常、システムのbinディレクトリにインストールされ./testず、書き込む必要があるため、私にとってもそれほど問題ではありません...
ereOn

10
@unapersson:いいえ、私が言ったことを正確に言っています。実行可能a.outファイルはフォーマットで生成されなくなりましたが、名前はレガシーの理由で残っています。(そして、あなたはあなたの問題その適切その後、シェルを使用してのしていることができない場合は、私の現在のディレクトリから実行可能ファイルを実行する方法1人の知っているためtestであるだけで罰金、あなた限り、実行可能ファイル名のためにしている書き込みだけで簡単なテスト当然の抜粋)。
軌道上での明度レース

4
実行可能ファイルに名前を付けることtestは、後悔するための困難な方法を学んだことであり、私は「完全にシェルを使用することができます」。これは悪い考えであり、「シェルを完全に使用できる」他の多くの人に噛み付いているのを見てきました。
James K. Polk大統領

46

次のように.aarユーティリティを使用してファイルを作成できます。

ar crf lib/libHeader.a header.o

libすべてのライブラリを含むディレクトリです。この方法でコードを編成し、コードとオブジェクトファイルを分離することをお勧めします。1つのディレクトリにすべてを含めると、一般的に見苦しくなります。上記の行はlibHeader.aディレクトリに作成されlibます。したがって、現在のディレクトリで次のように実行します。

mkdir lib

次に、上記のarコマンドを実行します。

すべてのライブラリをリンクするときは、次のように行うことができます。

g++ test.o -L./lib -lHeader -o test  

-Lフラグが取得するg++追加するlib/パスにディレクトリを。これにより、g++を探すときに検索するディレクトリがわかりlibHeaderます。-llibHeaderリンクする特定のライブラリにフラグを立てます。

test.oは次のように作成されます。

g++ -c test.cpp -o test.o 

2
そしてlib / libHeader.aとは何ですか?ar rcs ... ar crfよりも優れていませんか?
linuxx

1
@linuxx:main.oは、main.ccから作成するオブジェクトファイルになります
Sriram

@linuxx:arユーティリティで使用する正確なフラグは、要件に基づいた決定です。arのmanページを調べるとよいでしょう。
スリラム

test.cppを使用してライブラリをテストする方法
linuxx '10年

19
-lHeader代わりではないでしょう-llibHeaderか?
Dolanor 2012年

30

誰かが.cppと.hppファイルから静的ライブラリを作成する方法を教えてもらえますか?.oと.aを作成する必要がありますか?

はい。

.oを作成します(通常どおり)。

g++ -c header.cpp

アーカイブを作成します

ar rvs header.a header.o

テスト

g++ test.cpp header.a -o executable_name

1つのモジュールだけを含むアーカイブを作成するのは少し無意味に見えることに注意してください。簡単に書けます。

g++ test.cpp header.cpp -o executable_name

それでも、実際の使用例はモジュールが多く、少し複雑であるという疑問の恩恵を受けます。

お役に立てれば!


1
複数のモジュールを含めるにはどうすればよいですか?
Sidhin S Thomas 2016

2
いいね!時にはranlib、GNUでどちらが単に意味するかがわかりますar s
ベトナム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.