web-dev-qa-db-ja.com

メイクライブラリに静的ライブラリを含める方法

私は次のメイクファイルを持っています

CXXFILES = pthreads.cpp 

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = -lpthread -ldl

all:
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)

clean:
    rm -f prog *.o

./libmineライブラリをCXXFLAGSに含めようとしていますが、プログラムをコンパイルすると、多くの未定義参照エラーが発生するため、静的ライブラリを含める正しい方法ではないようです。それでは、実際にmakefileに静的ライブラリを含める正しい方法は何ですか?

27
pythonic
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread 
13
ouah

つかいます

LDFLAGS= -L<Directory where the library resides> -l<library name>

好む :

LDFLAGS = -L. -lmine

静的コンパイルを確実にするために、追加することもできます

LDFLAGS = -static

または、ライブラリ検索全体を取り除き、それと直接リンクすることができます。

main.c fun.cがあるとします

および静的ライブラリlibmine.a

makefileの最後のリンク行で行うことができます

$(CC) $(CFLAGS) main.o fun.o libmine.a
43
Aftnix

-Lオプションが-lオプションの前に表示されることを確認してください。リンカのコマンドラインでのオプションの順序does matter、特に静的ライブラリの場合。 -Lオプションは、ライブラリ(静的または共有)を検索するディレクトリを指定します。 -lnameオプションは、libmine.a(静的)またはlibmine.so(Unixのほとんどのバリアントで共有されますが、Mac OS Xは.dylibとHP-UXを使用するライブラリを指定します.sl)を使用します。従来、静的ライブラリはファイルlibmine.aにあります。これは慣習であり、必須ではありませんが、名前がlibmine.a形式でない場合、-lmine表記を使用して検索することはできません。コンパイラ(リンカー)コマンドラインに明示的にリストする必要があります。

-L./libmineオプションは、「ライブラリを見つけるために検索できるlibmineというサブディレクトリがあります」と言います。私は3つの可能性を見ることができます:

  1. libmine.aを含むこのようなサブディレクトリがあります。この場合、-lmineをリンカー行に追加する必要もあります(ライブラリを参照するオブジェクトファイルの後に)。
  2. 静的アーカイブであるファイルlibmineがあります。この場合、前に./libmineを付けずにファイル-Lとしてリストするだけです。
  3. 現在のディレクトリに取得したいファイルlibmine.aがあります。 ./libmine.aまたは-L . -lmineのいずれかを書くことができ、両方ともライブラリを見つけるはずです。
12

-Lは、単に.a または .soファイル。探しているのは-lmineLIBS変数に。

-static -lmine静的ライブラリを選択させる(静的ライブラリと動的ライブラリの両方が存在する場合)。

9
0xC0000022L