Linux ダイナミックライブラリの生成と使用ガイドの詳細な説明

Linux ダイナミックライブラリの生成と使用ガイドの詳細な説明

Linux での動的ライブラリ ファイルのファイル名は libxxx.so のようになります。ここで、so は Shared Object (共有可能な対象ファイル) の略語です。

動的ライブラリをリンクして実行可能ファイルを生成する場合、動的ライブラリのコードは実行可能ファイルにコピーされませんが、動的ライブラリへの参照が実行可能ファイルに記録されます。

プログラムが実行されると、動的ライブラリ ファイルが読み込まれます。ダイナミック ライブラリがすでにロードされている場合は、再度ロードする必要がないため、メモリ領域を節約できます。

Linux で動的ライブラリを生成して使用する手順は次のとおりです。

  • ソースファイルを書き込みます。
  • 1 つまたは複数のソース ファイルをコンパイルおよびリンクして、共有ライブラリを生成します。
  • 生成されたlibxxx.soをgccオプション-L<path> -lxxxでリンクします。
  • libxxx.so にリンクされたプログラムを実行するには、libxxx.so をリンク ライブラリの標準パスに配置するか、LD_LIBRARY_PATH を指定します。

以下、例を挙げて詳しく説明します。

ソースファイルの書き込み

ソース ファイル max.c を作成します。コードは次のようになります。

int max(int n1, int n2, int n3) の
{
  整数最大数 = n1;
  max_num = max_num < n2? n2: max_num;
  max_num = max_num < n3? n3: max_num;
  max_num を返します。
}

共有ライブラリをコンパイルして生成します。

gcc -fPIC -shared -o libmax.so max.c

libmax.so を取得します。

実際、上記のプロセスは、コンパイルとリンクの 2 つのステップに分かれています。-fPIC はコンパイル オプションです。PIC は Position Independent Code の略で、位置に依存しないコードを生成する必要があることを意味します。これは、動的ライブラリに必要な機能です。-shared はリンク オプションで、gcc に実行可能ファイルではなく動的ライブラリを生成するように指示します。

上記のコマンドラインは次のものと同等です:

gcc -c -fPIC 最大.c
gcc -shared -o libmax.so max.o

動的ライブラリのインターフェースファイルの作成

動的ライブラリでどのインターフェースが使用可能かをユーザーに知らせるためには、対応するヘッダー ファイルを作成する必要があります。

max.h を作成し、次のコードを入力します。

#ifndef __MAX_H__
# __MAX_H__ を定義します

int max(int n1, int n2, int n3);

#終了

テスト、動的ライブラリをリンクして実行可能ファイルを生成する

max 関数を使用する test.c ファイルを作成します。コードは次のとおりです。

#include <stdio.h>
#include "max.h"

int main(int argc, char *argv[])
{
  整数a = 10、b = -2、c = 100;
  printf("10、-2、100 の中での最大値は %d です。\n", max(a, b, c));
  0を返します。
}

gcc test.c -L. -lmax は a.out を生成します。ここで、-lmax は libmax.so をリンクすることを意味します。

-L. リンクするライブラリ ファイルを検索するときに現在のパスが含まれることを示します。

同じディレクトリに同じ名前の動的ライブラリと静的ライブラリがある場合、たとえば、libmax.soとlibmax.aの両方が現在のパスにある場合、
すると、gcc は動的ライブラリのリンクを優先します。

走る

./a.out を実行すると、次のエラー メッセージが表示されます。

./a.out: 共有ライブラリのロード中にエラーが発生しました: libmax.so: 共有オブジェクトファイルを開けません: そのようなファイルまたはディレクトリはありません

libmax.so が見つかりません。Linux は、/etc/ld.so.cache ファイルを通じてリンクする動的ライブラリを検索することがわかります。
/etc/ld.so.cache は、/etc/ld.so.conf ファイルを読み取る ldconfig プログラムによって生成されます。
(/etc/ld.so.conf に /lib と /usr/lib を含める必要はありません。ldconfig プログラムはこれらの 2 つのディレクトリを自動的に検索します)

libmax.so が配置されているパスを /etc/ld.so.conf に追加し、ldconfig プログラムを root 権限で実行して /etc/ld.so.cache を更新すると、a.out は実行時に libmax.so を見つけることができるようになります。

しかし、単純なテストケースとしては、システム内の変更は不適切と思われます。

もう一つの簡単な方法は、a.out に LD_LIBRARY_PATH を指定することです。

LD_LIBRARY_PATH=. ./a.out

プログラムは正常に実行されます。 LD_LIBRARY_PATH=. は、まず現在のパスでリンクされた動的ライブラリを検索するように a.out に指示します。

elf 形式の実行可能プログラムの場合、これは ld-linux.so* によって実行され、elf ファイルの DT_RPATH セグメント、環境変数 LD_LIBRARY_PATH、/etc/ld.so.cache ファイル リスト、/lib/、/usr/lib ディレクトリを検索し、見つかったライブラリ ファイルをメモリにロードします。

Makefileは作業を自動化する

次の内容の makefile を作成します。

.PHONY: ビルドテストクリーン

ビルド: libmax.so

libmax.so: max.o
 gcc -o $@ -shared $<

最大o: 最大c
 gcc -c -fPIC $<

テスト: a.out

a.out: test.c libmax.so
 gcc test.c -L. -lmax
 LD_LIBRARY_PATH=. ./a.out

クリーン:
 rm -f *.o *.so a.out

make build は libmax.so を生成し、make test は a.out を生成して実行し、make clean はコンパイルとテストの結果をクリーンアップします。

Linux 動的ライブラリ生成の詳細説明と使用ガイドに関するこの記事はこれで終わりです。Linux 動的ライブラリ生成に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linuxは動的ライブラリ、静的ライブラリを生成(ロード)し、サンプルメソッドをロードします。

<<:  MySQLの行数カウントに関する簡単な説明

>>:  Reactは二次的連鎖効果(階段効果)を実現する

推薦する

Linux の圧縮および解凍コマンドの紹介

目次一般的な圧縮形式: gz .bz2 .xz .zip一般的に使用されるアーカイブは圧縮を必要とす...

WeChatアプレット+EChartsで動的更新プロセス記録を実現

序文最近、小さなプログラムでリアルタイムにチャートを更新するという要件に遭遇しました。最初は wx-...

MySQL データベースのインデックスとトランザクション

目次1. 索引1.1 コンセプト1.2 機能1.3 索引作成の原則1.3.1 ディスクアクセス回数を...

ウェブページのテーブルの境界線を設定する方法

<br />前回は、Web テーブルにセルの線を設定する方法を学びました。今日は、Web...

マテリアルデザインで水滴アニメーションボタンを実現するための純粋なCSS

序文こういう特殊効果ってよく見かけますよね。すごくかっこいいですよね。 これは、Google Mat...

MySQL パラメータ関連の概念とクエリ変更方法

序文:以前の記事では、特定のパラメータの機能についてよく紹介してきました。しかし、MySQL パラメ...

CentOS8でルートパスワードを素早く変更する方法

Centos8仮想マシンを起動し、上下キーを押して図1のインターフェースの最初の行を選択します。図1...

Vue プロジェクトで axios リクエストを使用する方法

目次1. インストール2. カプセル化に問題はない3. ファイルを作成する4. アドレス設定をリクエ...

JavaScript でイベントのバブリングを防ぐ方法

注意すべき点は、イベントバブリング自体の特性上、メリットだけでなくデメリットも生じるということです。...

レスポンシブウェブデザインを実現するためにIEでCSS3メディアクエリをサポートする

今日の画面解像度は、320 ピクセル (iPhone) ほど小さいものから、2560 ピクセル以上 ...

CSS を使用して 3 つのステップでショッピング モールのカード クーポンを作成する

今日は618日、主要なショッピングモールはすべてプロモーション活動を行っています。今日は、次のように...

MySQLデータ移行の概要

目次序文: 1. データ移行について2. 移行計画と留意点要約:序文:日常業務では、テーブル、データ...

docker を使用して hbase をデプロイする方法

スタンドアロンの hbase について、まずは説明しましょう。 Dockerをインストールするまず ...

CSS--overflow:hidden のプロジェクト例

以下は、私のプロジェクトでこのプロパティを使用する方法の例です。 (1)激しく透明な浮遊コードをコピ...

Vue2.0/3.0 での provide と inject の使用例

目次1. provide/inject の用途は何ですか? 2. provide/injectの使い...