Linux obj は何の略ですか?

藏色散人
リリース: 2023-04-17 09:38:08
オリジナル
2178 人が閲覧しました

linux obj は、Linux の「.o」を表します。これはターゲット ファイルであり、Windows の「.obj」ファイルに相当します。obj には、コンパイルされたコードとデータが格納され、名前が付いています。接続時に未解決の外部シンボルが発生することがあります。

Linux obj は何の略ですか?

#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。

Linux obj は何の略ですか?

Linux の .a、.so、および .o ファイルの簡単な分析

Linux obj は何の略ですか?

# #はじめに

Linux プラットフォームにソース コードをインストールするとき、.so ファイルと .o ファイルの出力情報に遭遇することがよくあります。一般に、これらのファイルの出力情報をざっと確認するだけでよく、深く調べる必要はありません。ただし、ソース コードを自分で作成し、手動でコンパイルする必要がある場合は、この情報を深く理解する必要があります。

ファイルの説明

Linux の .so、.o、および .a ファイルは、実際には Windows の obj、lib、dll、exe およびその他のファイルに対応します。 Linux でのこれらのファイルについて説明する前に、まず Windows でのこれらのファイルの役割について説明します。

Windows における obj、lib、dll、および exe の関係

exe は、私たちが通常知っている実行可能プログラムの接尾辞であり、obj、lib、および dll は、実行プログラムを構成する主要なファイルです。プログラムをlibはdllに相当します。 lib はスタティック リンク ライブラリのライブラリ ファイル、dll はダイナミック リンク ライブラリのライブラリ ファイルです。

いわゆる静的とは、リンクするときに必要なものを抽出して exe ファイルに配置することを意味し、将来 exe を実行するときに lib は必要なくなります。いわゆる動的とは、exe の実行が dll で提供される関数に依存することを意味し、この dll がなければ exe は実行できません。

lib、dll、および exe はすべて、最終ターゲット ファイルおよび最終製品とみなされます。そして c/c はソースコードに属します。ソース コードと最終的なターゲット ファイルの間の遷移は中間コード obj ですが、実際、中間コードが必要な理由は、ターゲット ファイルを一度に取得できないためです。

たとえば、exe は多数の cpp ファイルを生成する必要があります。コンパイラは一度に 1 つの cpp ファイルのみをコンパイルできます。このようにして、コンパイラが cpp をコンパイルした後、obj にコンパイルされます。必要なすべての cpp が obj にコンパイルされると、それらは統合され、必要な exe にリンクされます。obj が不足すると、 exe リンクが失敗します。

obj はコンパイルされたコードとデータを名前付きで保存するため、接続中に未解決の外部シンボルの問題が発生することがあります。 exe に接続すると、名前の概念はなくなり、アドレスのみが存在します。 lib は、たくさんの obj を組み合わせたものです。

理論的には、obj ファイルを接続して他のプロジェクトを参照できます (obj ファイルは、それをコンパイルして生成する cpp ファイルと同等であると考えることができます。obj を参照して cpp を置き換えることも、cpp を追加することもできますobj) を置き換えますが、実際にはプロジェクト間の相互参照を実装するために Lib が通常使用されます。

コンパイラはデフォルトでいくつかの一般的に使用されるライブラリをリンクしますが、その他のライブラリは自分で指定する必要があります。

lib と dll の違い

lib はコンパイル時に必要で、dll は実行時に必要です。ソースコードのコンパイルを完了したい場合は、lib で十分です。動的にリンクされたプログラムを実行したい場合は、dll で十分です。開発フェーズとデバッグフェーズでは、両方を持つことがもちろん最善です。

一般的なダイナミック ライブラリ プログラムには、lib ファイルと dll ファイルが含まれます。 lib ファイルはコンパイル中にアプリケーションに接続する必要がありますが、dll ファイルは実行時にのみ呼び出されます。 dll ファイルがある場合、対応する lib ファイルは通常、インデックス情報であり、特定の実装は dll ファイル内にあります。 lib ファイルのみがある場合、この lib ファイルは静的にコンパイルされ、その中にインデックスと実装が含まれます。

静的にコンパイルされた lib ファイルには利点があります。それは、ユーザーに動的ライブラリをインストールするときに、動的ライブラリをインストールする必要がないことです。ただし、アプリケーションが比較的大きく、ダイナミックライブラリの柔軟性が失われ、バージョンアップの際には同時に新しいアプリケーションをリリースする必要があるというデメリットもあります。

ダイナミック ライブラリの場合、2 つのファイルがあり、1 つはインポート ライブラリ (.LIB) ファイルです (実際には静的ライブラリでもありますが、関数のみをインポート ライブラリのエントリにリンクできます)。 exe のリンク中に、実際の静的リンク ライブラリのように関数本体を exe に実際にリンクするのではなく、lib を介した動的リンクは実際には静的リンクを使用して実装されます)。1 つは dll ファイルで、インポートされたライブラリ ファイルには、によってエクスポートされたファイルが含まれます。 dll 関数の名前と場所。dll には実際の関数とデータが含まれています。アプリケーションは、LIB ファイルを使用して、使用する必要のある dll ファイルにリンクします。ライブラリ内の関数とデータは、実行可能ファイルにはコピーされません。 .

したがって、アプリケーションの実行ファイルには、呼び出される関数のコードではなく、dll 内で呼び出される関数のメモリアドレスが格納されます。このように、1 つ以上のアプリケーションが実行されているときに、プログラムコードと呼び出される関数が格納され、呼び出される関数コードがリンクされるため、メモリリソースが節約されます。上記の説明からわかるように、dll および .LIB ファイルはアプリケーションとともに配布する必要があります。そうしないと、アプリケーションでエラーが発生します。

dll 内の関数は 2 つのタイプに分類されます:

dll エクスポートされた関数はアプリケーションから呼び出すことができます;

dll 内部関数は DLL プログラムでのみ使用でき、アプリケーションは呼び出すことができませんそれらを呼び出してください。

Linux における .o、.a、および .so ファイルの違い

.o はターゲット ファイルであり、Windows の .obj ファイルに相当します。

.so は、動的接続に使用される共有ライブラリ、共有オブジェクトであり、Windows の dll に相当し、Linux の実行可能ファイルに相当します。

.a は静的ライブラリで、平たく言えば静的接続用に .o を束ねたもので、効果は .o と同じです。

静的関数ライブラリ

特徴: 実際には、プログラムが実行される前にターゲット プログラムに追加される、単純な通常のターゲット ファイルのコレクションです。

利点: 一部の以前のプログラムとの互換性、簡単な説明、プログラマはコードを再コンパイルせずにプログラムをリンクできるため、外部関数のサポートが不要となり、コードを再コンパイルする時間が節約されます (この利点は、もはや明白ではありません) ); 開発者はソース コードの機密性を保つこともできます。

このタイプのライブラリの名前は通常、libxxx.a です。静的関数ライブラリを使用してコンパイルされたファイルは、関数ライブラリ全体のすべてのデータがターゲット コードに統合されるため、比較的大きくなります。

欠点: 静的関数ライブラリが変更された場合、プログラムを再コンパイルする必要があります。

共有関数ライブラリ

共有関数ライブラリは実行プログラムの起動時にロードされ、全プログラムの再実行時に共有関数ライブラリ内の関数を自動的にロードすることができます。静的関数ライブラリと比較すると、共有関数ライブラリはコンパイル中にターゲット コードにコンパイルされません。

共有関数ライブラリ内の対応する関数は、プログラムが該当する関数を実行するときにのみ呼び出されるため、共有関数ライブラリによって生成される実行可能ファイルは比較的小さいです。共有関数ライブラリはプログラムに統合されていないため、ただし、プログラムの実行時に動的に適用され呼び出されるため、対応するライブラリをプログラムの実行環境に提供する必要があります。

共有関数ライブラリへの変更はプログラムには影響しないため、共有関数ライブラリをアップグレードすると便利です。

関連する推奨事項: 「Linux ビデオ チュートリアル

以上がLinux obj は何の略ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート