Linux での動的ライブラリ ファイルのファイル名は libxxx.so のようになります。ここで、so は Shared Object (共有可能な対象ファイル) の略語です。 動的ライブラリをリンクして実行可能ファイルを生成する場合、動的ライブラリのコードは実行可能ファイルにコピーされませんが、動的ライブラリへの参照が実行可能ファイルに記録されます。 プログラムが実行されると、動的ライブラリ ファイルが読み込まれます。ダイナミック ライブラリがすでにロードされている場合は、再度ロードする必要がないため、メモリ領域を節約できます。 Linux で動的ライブラリを生成して使用する手順は次のとおりです。
以下、例を挙げて詳しく説明します。 ソースファイルの書き込み ソース ファイル 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の両方が現在のパスにある場合、 走る ./a.out を実行すると、次のエラー メッセージが表示されます。
libmax.so が見つかりません。Linux は、/etc/ld.so.cache ファイルを通じてリンクする動的ライブラリを検索することがわかります。 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
序文システム領域の使用量が大きすぎて消去する必要がある場合、または特定のファイルを消去する必要がある...
a.htmとb.htmの2つのファイルがあります。同じディレクトリ内のa.htmの内容は次のとおりで...
戦争パッケージを準備する1. 既存のSpringBootプロジェクトを準備し、pomに依存関係を追加...
JavaScript に依存せず、純粋な CSS を使用してsvgストローク描画アニメーション効果と...
目次BOM (ブラウザ オブジェクト モデル) 1. ウィンドウブラウザのウィンドウサイズを取得する...
目次1. 公式インストールスクリプトを使用した自動インストール手動インストール古いバージョンをアンイ...
テーブルを削除することはあまり一般的ではありませんが、特に外部キーの関連付けがあるテーブルの場合は、...
最近、プロジェクトの開発時に MySql データベースを使用しました。MySql に関する記事をいく...
ソフトウェア開発者は、ネットワーク アプリケーションがどのように動作するかを階層的に完全に理解してい...
1. プロジェクトを右クリックしてプロパティを選択します2. プロジェクトファセットをクリック3. ...
今日、仕事中に左結合に関するSQLの問題に遭遇しました。後で解決しましたが、この問題を通じてSQLの...
システムでは多くのコマンドが使用されていますが、使用したコマンドをどのように確認すればよいでしょうか...
私のプロジェクトの特定の機能ではサーバーが rabbitmq にメッセージを送信する必要があるため、...
ドメイン名を使ってプロジェクトにアクセスする方法が気になったのですが、自分でドメイン名を取得するのは...
黄金律常に同じコーディング標準セットに従ってください。同じプロジェクトに何人の人が関わっているかに関...