38

次のメイクファイルがあります

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いますが、プログラムをコンパイルすると多くの未定義参照エラーが発生するため、静的ライブラリを含める正しい方法ではないようです。では、メイクファイルに静的ライブラリを含める実際の正しい方法は何でしょうか?

4

4 に答える 4

58

使用する

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
于 2012-07-05T13:31:11.320 に答える
22
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread 
于 2012-07-05T13:32:17.690 に答える
13

-Lオプションがオプションの前に表示されることを確認してください-l特にスタティック ライブラリで、リンカー コマンド ラインのオプションの順序は重要です。このオプションは、ライブラリ (静的または共有) を検索するディレクトリを指定します。このオプションは、(静的) または(Unix のほとんどのバリアントで共有されますが、Mac OS X は使用し、HP-UX は以前は を使用していました) のライブラリを指定します。通常、スタティック ライブラリは file に格納されます。これは慣例であり、必須ではありませんが、名前が形式に含まれていない場合、表記を使用して検索することはできません。コンパイラ (リンカー) コマンド ラインで明示的に指定する必要があります。-L-lnamelibmine.alibmine.so.dylib.sllibmine.alibmine.a-lmine

-L./libmineオプションには、「ライブラリを見つけるために検索できるサブディレクトリが呼び出されlibmineます」と表示されます。次の 3 つの可能性があります。

  1. を含むサブディレクトリがlibmine.aある場合は-lmine、リンカー行 (ライブラリを参照するオブジェクト ファイルの後) にも追加する必要があります。
  2. 静的アーカイブであるファイルlibmineがあります。この場合、前 ./libmineに何もないファイルとして単純にリストします。-L
  3. libmine.a現在のディレクトリに、ピックアップしたいファイルがあります。あなたが書く./libmine.a-L . -lmine、両方ともライブラリを見つける必要があります。
于 2012-07-05T13:56:59.333 に答える
10

またはファイル-Lを検索するパスを指定するだけです。あなたが探しているのは、変数に追加することです。.a.so-lmineLIBS

強制-static -lmine的に静的ライブラリを選択するようにします (静的ライブラリと動的ライブラリの両方が存在する場合)。

追加:ファイルへのパスがリンカ(またはコンパイラドライバ)に伝えられたと仮定する-Llibfoo.a-l:libfoo.a. この場合、名前には従来のlib接頭辞 - が含まれていることに注意してください。この方法で完全なパスを指定することもできます。リンカーを正しい場所に「導く」には、これがより良い方法である場合があります。

于 2012-07-05T13:10:52.720 に答える