通常のプログラムと比較すると、ダイナミック リンク ライブラリにはメイン関数がなく、一連の関数の実装です。共有および 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 権限を設定する方法
プロジェクトの要件は、日付と時刻を選択し、現在の時刻以降の時刻のみを選択し、最小レベルを分単位で無効...
目次抽象化と再利用シリアルセグメントシリアル、セグメントパラレル要約するはじめに: JS は当然並列...
目次1. 上の写真2. ユーザーが存在しない3. コードをアップロードする1. 上の写真 2. ユー...
他の人のために解決した問題を記録します。問題の説明MySQLのバージョンは5.7、オペレーティングシ...
getElementByIdはオブジェクトを取得できませんブラウザがドキュメントを解析するときにはシ...
1 ユーザーを作成し、ユーザーのルートパスとパスワードを指定します useradd -d /home...
目次1. vue-video-playerをインストールする2. vue-video-playerを...
このステータス コードは、リクエストのステータスに関する情報を提供し、サイトとリクエストされたページ...
1. ネストされたルーティングはサブルーティングとも呼ばれます。実際のアプリケーションでは、通常、ネ...
Linux システムで iso ファイルをインストールするにはどうすればいいですか?インストール手順...
目次1. gojsの紹介2. Gojsのアプリケーションシナリオ3. gojs を選ぶ理由: 4. ...
弊社のネットワーク管理センターは管理センター兼サーバーとして機能します!各管理対象デバイスは、TCP...
最近、たまたま vue+springboot のフロントエンドとバックエンドの分離プロジェクトに触れ...
目次インデックスタイプインデックス構造非クラスター化インデックスクエリインデックスカバー要約するイン...
序文この記事では、docker-compose の構成をいくつか紹介します。これらを参考にして、独自...