gcc静的ライブラリと動的ライブラリ
//hello.c
#include
void print_hello()
{
printf("HelloWorld ");
}
//main.c
#include
#include "hello.h"
int main()
{
print_hello();
printf("%d",HELLO);
return 0;
}
//hello.h
#define HELLO 9999
void print_hello();
その中でhello.cとmain.c同じディレクトリの下でhello.hは前のディレクトリにあります.
先生はxxxです.oファイル$gcc hello.c -c ==> hello.o $ gcc main.c -c ==> error : no hello.h $ gcc main.c -c -I ../==> main.o-Iヘッダファイルの検索ディレクトリ(Iはサイズi)$ls=>helloを指定します.o main.o hello.c main.c
静的ライブラリの生成
$ ar cr libhello.a hello.o ==> libhello.a(注意手順)
静的ライブラリの使用
$ gcc main.o -o main.out-lhello=>error:/usr/bin/ld:cannot find-lhello、ライブラリが見つからない-lは小文字Lです
1.linuxでのデフォルトgcc検索はLD_LIBRARY_PATHで検索したのは、標準ライブラリ(ダイナミックライブラリと静的ライブラリ)が/usr/lib/の下にある
2.-lhelloはlibhelloを検索することを示す約束です.aまたはlibhello.soのライブラリ、-lXXXXすなわちlibXXXX.a又はlibXXXXX.so
3.-Lでライブラリをロードするディレクトリを指定できます
$ gcc main.o -o main.out -L .-lhello=>mainが表示されました.アウト、成功!
静的ライブラリのテスト
$ rm libhello.a-f=>>プログラムは同様に実行でき、静的ライブラリがプログラムにリンクされていることを示します!
ダイナミックライブラリの生成
$ gcc hello.o -o libhello.so -shared ==> libhello.so
ダイナミックライブラリの使用
$ gcc main.o -o main.out -L .-lhello=>-Lライブラリの場所を指定し、-lhelloはlibhelloを指定します.aまたはlibhello.so
$ ./main.out ==> error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
ダイナミックリンクライブラリはプログラムの実行時にロードされ、ロード時に標準ディレクトリ/usr/libから検索されます.次は3つの解決方法です.
1. $ cp libhello.so/usr/lib/==> libhello.soコピー/usr/lib/下り
2. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
//export LD_LIBRARY_PATH=$LD_LIBRARY_PATH :
3 . /etc/ld.so.confにライブラリのディレクトリを1行追加しldconfigを実行します
/etc/ld.so.confファイル:標準ディレクトリ(/libおよび/usr/lib)のほか、リンクとローダが共有ライブラリを検索するときにチェックする他のディレクトリ、このファイルに関連するコマンドはldconfigです.
ダイナミックライブラリのテスト
$ rm libhello.so=>>実行中にエラーが発生し、プログラム実行時にライブラリが必要であることを示します!