linuxの下で動的リンクライブラリをコンパイルする小さな例
2038 ワード
最近、プロジェクトでライブラリをコンパイルする必要がありますが、linuxの下のダイナミックリンクライブラリの使用についてはまだよく知られていません.そのため、ここでは、小さな例を書いて、自分のダイナミックリンクライブラリを作成し、このdemoでlinuxの下のダイナミックリンクライブラリの使用知識を熟知します.
私たちが用意したdemoのファイル構成
1.testa.c
3. testc.c
5. main.c
-sharedこのオプションは、外部プログラムが接続できないことを示す動的接続ライブラリの生成を指定します(コネクタにTタイプのエクスポートシンボルテーブルを生成させ、弱い接続Wタイプのエクスポートシンボルを生成させる場合もあります).実行可能ファイル-fPICに相当します:コンパイルが位置独立のコードであることを示し、このオプションを使用しないとコンパイルされたコードは位置関連であるため、動的にロードするときはコードコピーによって異なるプロセスのニーズを満たし、真のコードセグメント共有の目的を達成することはできません.
そして、コマンドで
-L.:接続するライブラリが現在のディレクトリにあることを示します-ltest:コンパイラは動的接続ライブラリを検索する際に暗黙の命名規則があります.すなわち、与えられた名前の前にlibを付け、後に付けます.soはライブラリの名前を決定する
プログラムをメモリで実行するには、コンパイルのほかにリンクと読み込みの2つのステップが必要であることを知っています.もちろんlinuxでのダイナミックリンクもこの3つのプロセスを経ています.Linuxはこのld-linuxを使用します.so*の中のは、他のライブラリをマウントします(実際にはリンクにすぎません).したがって、このライブラリはlinux/libの下に置かなければなりません.その他の場合、通常、共有ライブラリは/libというパスの下に配置され、システムのデフォルトの検索パスでもあります.Linux共有ライブラリの検索パス順:1、ターゲットコードのコンパイル時に指定したダイナミックライブラリ検索パス:コンパイル時に-WL、-rpath=パス2、環境変数LD_LIBRARY_PATHが指定するダイナミックライブラリ検索パス3、プロファイル/etc/ld.so.confで指定したダイナミックライブラリ検索パス4、デフォルトのダイナミックライブラリ検索パス/lib 5、デフォルトのダイナミックライブラリ検索パス/usr/lib
ここでは、2番目の方法でこのダイナミックライブラリを使用して、まず以下のコマンドを実行し、LD_を設定します.LIBRARY_PATHの値
私たちが用意したdemoのファイル構成
1.testa.c
#include
void Test_a()
{
printf("This is Test_a!");
}
2. testb.c #include
void Test_b()
{
printf("This is Test_b!");
}
3. testc.c
#include
void Test_c()
{
printf("This is Test_c!");
}
4. testh.h void Test_a();
void Test_b();
void Test_c();
5. main.c
#include "testh.h"
int main()
{
Test_a();
Test_b();
Test_c();
return 0;
}
現在、3つのtest関数を1つのダイナミックライブラリにコンパイルし、コマンドを使用します.gcc -fPIC -shared testa.c testb.c testc.c -o libtest.so
libtestが生成する.soファイル、コマンド-sharedこのオプションは、外部プログラムが接続できないことを示す動的接続ライブラリの生成を指定します(コネクタにTタイプのエクスポートシンボルテーブルを生成させ、弱い接続Wタイプのエクスポートシンボルを生成させる場合もあります).実行可能ファイル-fPICに相当します:コンパイルが位置独立のコードであることを示し、このオプションを使用しないとコンパイルされたコードは位置関連であるため、動的にロードするときはコードコピーによって異なるプロセスのニーズを満たし、真のコードセグメント共有の目的を達成することはできません.
そして、コマンドで
gcc main.c -L. -ltest -omain
コンパイル生成アプリケーションmain、コマンド中-L.:接続するライブラリが現在のディレクトリにあることを示します-ltest:コンパイラは動的接続ライブラリを検索する際に暗黙の命名規則があります.すなわち、与えられた名前の前にlibを付け、後に付けます.soはライブラリの名前を決定する
プログラムをメモリで実行するには、コンパイルのほかにリンクと読み込みの2つのステップが必要であることを知っています.もちろんlinuxでのダイナミックリンクもこの3つのプロセスを経ています.Linuxはこのld-linuxを使用します.so*の中のは、他のライブラリをマウントします(実際にはリンクにすぎません).したがって、このライブラリはlinux/libの下に置かなければなりません.その他の場合、通常、共有ライブラリは/libというパスの下に配置され、システムのデフォルトの検索パスでもあります.Linux共有ライブラリの検索パス順:1、ターゲットコードのコンパイル時に指定したダイナミックライブラリ検索パス:コンパイル時に-WL、-rpath=パス2、環境変数LD_LIBRARY_PATHが指定するダイナミックライブラリ検索パス3、プロファイル/etc/ld.so.confで指定したダイナミックライブラリ検索パス4、デフォルトのダイナミックライブラリ検索パス/lib 5、デフォルトのダイナミックライブラリ検索パス/usr/lib
ここでは、2番目の方法でこのダイナミックライブラリを使用して、まず以下のコマンドを実行し、LD_を設定します.LIBRARY_PATHの値
export LD_LIBRARY_PATH=.
その後、コマンドを使えばOK./main