私は次のメイクファイルを持っています
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に静的ライブラリを含める正しい方法は何ですか?
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread
つかいます
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
-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つの可能性を見ることができます:
libmine.a
を含むこのようなサブディレクトリがあります。この場合、-lmine
をリンカー行に追加する必要もあります(ライブラリを参照するオブジェクトファイルの後に)。libmine
があります。この場合、前に./libmine
を付けずにファイル-L
としてリストするだけです。libmine.a
があります。 ./libmine.a
または-L . -lmine
のいずれかを書くことができ、両方ともライブラリを見つけるはずです。-L
は、単に.a
または .so
ファイル。探しているのは-lmine
をLIBS
変数に。
-static -lmine
静的ライブラリを選択させる(静的ライブラリと動的ライブラリの両方が存在する場合)。