通常のプログラムと比較すると、ダイナミック リンク ライブラリにはメイン関数がなく、一連の関数の実装です。共有および fPIC コンパイル パラメータを使用してダイナミック リンク ライブラリ ファイルを生成します。プログラムがライブラリ関数を呼び出すときは、このライブラリに接続するだけで済みます。たとえば、次の例では、単純な整数演算トランスポート ダイナミック リンク ライブラリを実装し、calculate.h と calculate.c という 2 つのファイルを定義し、libcac.so ダイナミック リンク ライブラリを生成します。 バイナリファイルに役立つコマンド ファイルの種類を確認してください ファイル バイナリがリンクされているライブラリを確認する ldd バイナリファイルに含まれるシンボルを表示します。Tはロード中、Uは未定義のシンボルを意味します。 ナノメートル バイナリファイルから情報を読み取る readelf -a smu.o バイナリファイルをアセンブリに変換する objdump -d 合計.o ダイナミックリンクライブラリの生成 合計.c #include <stdio.h> #include <stdlib.h> int 合計(int x){ int i、結果=0; (i=0; i<=x; i++){ 結果+=i; } (x > 100)の場合 終了(-1); 結果を返します。 }; void display(char* msg){ printf("%s\n",メッセージ); } int add(float a,float b){ a+b を返します。 } int sum_array(int 配列[], int 数値){ int i = 0、合計 = 0; (i=0; i<num; ++i) の場合 合計 += 配列[i]; 合計を返します。 } voidmodify_array(int配列[], int数値){ int i = 0、合計 = 0; (i=0; i<num; ++i) の場合 配列[i] *= 10; } メイン.c #include <stdio.h> #include <stdlib.h> int main(void){ 整数x; printf("整数を入力してください:\n"); scanf("%d", &x); printf("合計=%d\n", sum(x)); 0を返します。 }; 実行ファイルを生成する gcc -c main.c -o main.o gcc -c sum.c -o sum.o gcc 合計.o メイン.o メインの実行ファイルが生成されます ファイル main // ELF 64 ビット LSB 実行可能ファイル ファイル sum.o // ELF 64 ビット LSB 再配置可能 sum.cには再利用可能な関数が含まれているため、sum.cをダイナミックリンクライブラリにコンパイルしたい。 gcc sum.o -shared -o sum.so エラーが発生しました。
つまり、すべての .o ファイルをダイナミック リンク ライブラリにコンパイルできるわけではありません。.o ファイルを生成するときは、パラメータ -fPIC を追加する必要があります。 gcc -c sum.c -fPIC -o sum.o gcc sum.o -o 共有 sum.so 一般的に、共有ライブラリのコンパイルコマンドは(前回の実験) ダイナミック リンク ライブラリ gcc -shared -fPIC -o libmyhello.so hello.o gcc -o hello main.c -L. -lmyhello 静的リンク ar rcs libxx.a xx.o g++ -o main main.cpp -static -L. -lxx 現時点では g++ -o メイン main.c sum.so 。/主要 時々エラーが報告される
lddメイン 出力: sum.so => 見つかりません この時点で、 エクスポート $LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH 注: -fPIC は .o を生成するときに使用され、-shared はダイナミック リンク ライブラリを生成するときに使用されます。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: phpmyadmin を使用して MySQL 権限を設定する方法
[問題の説明]私たちの実稼働環境には、複数の MySQL サーバー (MySQL 5.6.21) の...
導入Kubernetes を使い始めるのに丸一日を費やしたことはありませんか?最近登場したいくつかの...
公式サイトからmysql-5.6.37-winx64.zipの解凍バージョンをダウンロードし、構成フ...
目次1. エラー現象2. エラー分析3. エラー解決1. エラー現象仮想マシンでLVGLエミュレータ...
目次複雑なクエリとステップバイステップのクエリクエリステートメントを分割する共同クエリの分解問題のあ...
同僚から、一時テーブルを使用して変数データを挿入して表示する方法を教わったことがありますが、この方法...
目次1. CentOS7.0へのJDK1.8のインストール2. Dockerのインストール3.Doc...
派生テーブルについてメイン クエリに派生テーブルが含まれている場合、または SELECT ステートメ...
この記事では、Vite を使用して Vue 3 デスクトップ プロジェクトを開発する方法について説明...
CSS3 は反転可能なホバー効果を実装します。具体的なコードは次のとおりです。 1.css /*基本...
Web ページのパフォーマンスを向上させるために、多くの開発者は、JavaScript、画像の最適化...
1. sql_modeを確認する @@sql_mode を選択照会された値は次のとおりです。 ON...
この記事は、WindowsでのMySQL 8.0.11のインストールチュートリアルを記録しています。...
序文Workbench が 1 台のコンピューターにインストールされており、別の Ubuntu サー...
1. フォルダを削除する例: rm -rf /usr/java /usr/javaディレクトリとその...