GCCコンパイル依存ライブラリとプログラム実行依存ライブラリ設定

4230 ワード

一、GCCでコンパイルするときに-Lを使用して設定する依存ライブラリがプログラム実行時依存ライブラリの検索パスだと思っていたが、これはリンク環境と実行環境のコンパイルという2つの概念である.問題:-rpathを使用してランタイムパスを設定しないと、プログラムの実行時に「./overflows:error while loading shared libraries:libnet.so.9:cannot open shared object file:No such file or directory」エラーが発生します.デフォルトの検索パスは/lib 64です....このパスで検索できないとエラーになります.
二、GCCパラメータの意味:http://blog.csdn.net/ibingow/article/details/7882098 -L:リンクの検索パスを指定し、複数のパスをカンマで区切る-rpath:生成されたターゲットプログラムの共有ライブラリ検索パスを指定できます.-rpathオプションで指定したディレクトリは実行可能ファイルにハードコーディングされ、-rpath-linkオプションで指定したディレクトリはリンクフェーズでのみ有効になります.この2つのオプションは、リンクldのオプションです.その他のリンクオプションはmanldで表示できます.-I(大文字i):ヘッダファイルの検索パスを指定します.-l(小文字l):ライブラリをリンクすることを指定します.リンクを指定するのはlibxxx.so.x.y.zのライブラリです.-lxxxを書くだけでいいです.コンパイラは現在の環境に基づいて、関連パスでxxxというライブラリを検索します.xxxは共有ライブラリのリンク名(link name)とも呼ばれる.異なるライブラリには、動的および静的バージョン、libxxx.a libxxx.soなどの同じリンク名がある場合があります.リンク時に-lxxxを使用すると、リンクは出力ファイルの状況(ダイナミック/静的)に応じて適切なバージョンを選択します.たとえばldが-staticパラメータを使用すると静的バージョンが使用され、-Bdynamicが使用される場合(これもデフォルト)、動的バージョンが使用されます.
三、ダイナミックライブラリリンク時、実行時に経路を検索する順序ターゲットコードをコンパイルする時に指定したダイナミックライブラリ検索経路;環境変数LD_LIBRARY_PATHが指定したダイナミックライブラリ検索パス;プロファイル/etc/ld.so.confで指定したダイナミックライブラリ検索パス.デフォルトの動的検索パス/lib;デフォルトのダイナミックライブラリ検索パス/usr/lib
四、example:
srcdir      = .
CC      = gcc
CFLAGS      = -g -O2 -D_BSD_SOURCE
LDFLAGS     = -Wl,-rpath,/usr/local/lib

PCAP_CFLAGS = -I/usr/local/include
PCAPLIB     = -L/usr/local/lib -lpcap

LNET_CFLAGS = -I/usr/local/include -D_BSD_SOURCE -D__BSD_SOURCE -D__FAVOR_BSD -DHAVE_NET_ETHERNET_H
LNETLIB     = -lnet

LIBS_CFLAGS = -I../src $(PCAP_CFLAGS) $(LNET_CFLAGS)
LIBS        = -L../src -lnids $(PCAPLIB) $(LNETLIB) -lgthread-2.0 -lnsl -lglib-2.0
.c.o:
    $(CC) -c $(CFLAGS) -I. $(LIBS_CFLAGS) $<

all: overflows printall sniff
static shared: all

overflows: overflows.o
    $(CC) -o $@ overflows.o $(LDFLAGS) $(LIBS)
printall: printall.o
    $(CC) -o $@ printall.o $(LDFLAGS) $(LIBS)
sniff: sniff.o
    $(CC) -o $@ sniff.o $(LDFLAGS) $(LIBS)
static shared install installshared:
    @true
clean:
    rm -f *.o *~ overflows printall sniff