Linux Makefile静的ライブラリ動的ライブラリ適用例
Linuxシステムでは、
静的ライブラリの作成
gcc -c filen.c ar -cr libname.a file1.o file2.o ... Ar:静的関数ライブラリ作成のコマンド-c:createの意味-r:replaceの意味で、現在挿入されているモジュール名がライブラリに存在していることを示し、同名のモジュールを置き換えます.いくつかのモジュールに1つのモジュールがライブラリに存在しない場合、arは他の同じ名前のモジュールを置き換えないエラー情報を表示します.デフォルトでは、新しいメンバーがクッドの最後に追加されます.
ダイナミックライブラリの作成
gcc -shared -fpic -o libname.so test1.c test2.c .... -fpic:コード位置依存コードの生成
-shared共有ライブラリを生成
Makefileライブラリファイルの作成
分かりやすい方法は次のとおりです.
上の?=変数に値が割り当てられていない場合、担当する操作を行うことを示します.
以下に、管理しやすいが分かりにくい書き方があります.
次のファイルがあります.
ファイルの内容は、「Makfileアプリケーションのステップアップインスタンス」の内容と一致して、ディレクトリsourceファイルを動的ライブラリと静的ライブラリにパッケージ化し、その後、ライブラリファイルをlibディレクトリにインストールし、sourceディレクトリの下のMakefile Makefileを呼び出します.
実行結果:
ライブラリファイルの適用:
shellで直接コマンドを使用する場合は、次の手順に従います.
ライブラリファイルを動的に呼び出すには、次の手順に従います.
gcc main.c-I./include/-L./lib/-ltest-o app実行可能ファイルAPPを実行する前に、動的ライブラリの場所を指定する必要があります.そうしないと、ライブラリファイルが見つからないエラーが発生します.export LD_LIBRARY_PATH='/home/biao/test/Makefile_test/lib/'ライブラリの場所を指定しない場合は、/libまたは/usr/libの下に直接ライブラリを置くこともできます.
静的ライブラリファイル呼び出し:
gcc -static main.c -I./include/-L./lib/-ltest -o app_staticのもう一つの方法:静的ライブラリgcc mainを直接追加する.c -I./include/./lib/libtest.a -o app_static静的ライブラリと動的ライブラリが同時に存在する場合、デフォルトでは動的ライブラリが使用されます.
Makefileでライブラリファイルをリンクするには、次の手順に従います.
ここでは2つの実行可能ファイルを同時に生産します:share_testとstatic_test
実行結果は次のとおりです.
テストコードはここでダウンロードできます:Linux Makefile静的ライブラリ動的ライブラリアプリケーションインスタンス
静的ライブラリの作成
gcc -c filen.c ar -cr libname.a file1.o file2.o ... Ar:静的関数ライブラリ作成のコマンド-c:createの意味-r:replaceの意味で、現在挿入されているモジュール名がライブラリに存在していることを示し、同名のモジュールを置き換えます.いくつかのモジュールに1つのモジュールがライブラリに存在しない場合、arは他の同じ名前のモジュールを置き換えないエラー情報を表示します.デフォルトでは、新しいメンバーがクッドの最後に追加されます.
ダイナミックライブラリの作成
gcc -shared -fpic -o libname.so test1.c test2.c .... -fpic:コード位置依存コードの生成
-shared共有ライブラリを生成
Makefileライブラリファイルの作成
分かりやすい方法は次のとおりです.
LIB_NAME?= test
STATIC_NAME ?= lib$(LIB_NAME).a
SHARE_NAME ?= lib$(LIB_NAME).so
all: static_library shared_library
static_library:
gcc -c *.c;
ar -cr $(STATIC_NAME) *.o;
shared_library:
gcc -shared -fpic -o $(SHARE_NAME) *.c;
clean:
rm -rf *.o
rm -rf *.a *.so
上の?=変数に値が割り当てられていない場合、担当する操作を行うことを示します.
以下に、管理しやすいが分かりにくい書き方があります.
LIB_NAME?= test
STATIC_NAME ?= lib$(LIB_NAME).a
SHARE_NAME ?= lib$(LIB_NAME).so
all:$(STATIC_NAME) $(SHARE_NAME)
%.o:%.c
$(CC) -c $< -o $@
SOURCE := $(wildcard *.c)
OBJS := $(patsubst %.c,%.o,$(SOURCE))
$(STATIC_NAME):$(OBJS)
$(AR) -cr $(STATIC_NAME)
$(SHARE_NAME):$(OBJS)
gcc -shared -fpic -o $(SHARE_NAME) $(SOURCE)
clean:
rm -rf $(OBJS) $(STATIC_NAME) $(SHARE_NAME)
次のファイルがあります.
.
├── include
│ ├── test1.h
│ ├── test2.h
│ └── test3.h
├── lib
├── main.c
├── Makefile
└── source
├── Makefile
├── Makefile1
├── test1.c
├── test2.c
└── test3.c
└── test3.o
ファイルの内容は、「Makfileアプリケーションのステップアップインスタンス」の内容と一致して、ディレクトリsourceファイルを動的ライブラリと静的ライブラリにパッケージ化し、その後、ライブラリファイルをlibディレクトリにインストールし、sourceディレクトリの下のMakefile Makefileを呼び出します.
LIB_NAME?= test
STATIC_NAME ?= lib$(LIB_NAME).a
SHARE_NAME ?= lib$(LIB_NAME).so
all: static_library shared_library
static_library:
gcc -c *.c;
ar -cr $(STATIC_NAME) *.o;
shared_library:
gcc -shared -fpic -o $(SHARE_NAME) *.c;
install:
mv $(STATIC_NAME) ../lib
mv $(SHARE_NAME) ../lib
clean:
rm -rf *.o
rm -rf $(STATIC_NAME) $(SHARE_NAME)
実行結果:
biao@ubuntu:~/test/Makefile_test/source$
biao@ubuntu:~/test/Makefile_test/source$
biao@ubuntu:~/test/Makefile_test/source$ make
gcc -c *.c;
ar -cr libtest.a *.o;
gcc -shared -fpic -o libtest.so *.c;
biao@ubuntu:~/test/Makefile_test/source$ make install
mv libtest.a ../lib
mv libtest.so ../lib
biao@ubuntu:~/test/Makefile_test/source$ cd ../
biao@ubuntu:~/test/Makefile_test$ tree
.
├── include
│ ├── test1.h
│ ├── test2.h
│ └── test3.h
├── lib
│ ├── libtest.a
│ └── libtest.so
├── main.c
├── Makefile
└── source
├── Makefile
├── Makefile1
├── test1.c
├── test1.o
├── test2.c
├── test2.o
├── test3.c
└── test3.o
3 directories, 15 files
biao@ubuntu:~/test/Makefile_test$
ライブラリファイルの適用:
shellで直接コマンドを使用する場合は、次の手順に従います.
ライブラリファイルを動的に呼び出すには、次の手順に従います.
gcc main.c-I./include/-L./lib/-ltest-o app実行可能ファイルAPPを実行する前に、動的ライブラリの場所を指定する必要があります.そうしないと、ライブラリファイルが見つからないエラーが発生します.export LD_LIBRARY_PATH='/home/biao/test/Makefile_test/lib/'ライブラリの場所を指定しない場合は、/libまたは/usr/libの下に直接ライブラリを置くこともできます.
静的ライブラリファイル呼び出し:
gcc -static main.c -I./include/-L./lib/-ltest -o app_staticのもう一つの方法:静的ライブラリgcc mainを直接追加する.c -I./include/./lib/libtest.a -o app_static静的ライブラリと動的ライブラリが同時に存在する場合、デフォルトでは動的ライブラリが使用されます.
Makefileでライブラリファイルをリンクするには、次の手順に従います.
EXE?= test
SHARE_EXE ?= share_$(EXE)
STATIC_EXE ?= static_$(EXE)
INCL := -I./include/
LIB := -L./lib/
LIB_NAME := test
FLAG := -static
all: static_app shared_app
static_app:
$(CC) $(FLAG) main.c $(INCL) $(LIB) -l$(LIB_NAME) -o $(STATIC_EXE)
shared_app:
$(CC) main.c $(INCL) $(LIB) -l$(LIB_NAME) -o $(SHARE_EXE)
clean:
rm -rf $(STATIC_EXE) $(SHARE_EXE)
ここでは2つの実行可能ファイルを同時に生産します:share_testとstatic_test
実行結果は次のとおりです.
biao@ubuntu:~/test/Makefile_test$
biao@ubuntu:~/test/Makefile_test$ ls
include lib main.c Makefile source
biao@ubuntu:~/test/Makefile_test$ make
cc -static main.c -I./include/ -L./lib/ -ltest -o static_test
cc main.c -I./include/ -L./lib/ -ltest -o share_test
biao@ubuntu:~/test/Makefile_test$ ls
include lib main.c Makefile share_test source static_test
biao@ubuntu:~/test/Makefile_test$ ./share_test
I am test1 !
I am test2 !
I am test3 !
biao@ubuntu:~/test/Makefile_test$ ./static_test
I am test1 !
I am test2 !
I am test3 !
biao@ubuntu:~/test/Makefile_test$
biao@ubuntu:~/test/Makefile_test$
テストコードはここでダウンロードできます:Linux Makefile静的ライブラリ動的ライブラリアプリケーションインスタンス