私は、コマンドラインアプリケーションはスタンドアロンで、シェルから呼び出すことができることを知っています。一方、静的ライブラリは他のプログラムによってリンクされています。静的ライブラリとコマンドラインアプリケーションの違いは何ですか?
実際には2つの違いは何ですか?異なるバイナリインターフェイスですか?それとも全く違うの?
私は、コマンドラインアプリケーションはスタンドアロンで、シェルから呼び出すことができることを知っています。一方、静的ライブラリは他のプログラムによってリンクされています。静的ライブラリとコマンドラインアプリケーションの違いは何ですか?
実際には2つの違いは何ですか?異なるバイナリインターフェイスですか?それとも全く違うの?
これは全く異なるものです。スタンドアロンアプリケーションには、直接実行可能なバイナリ製品があります。ただし、静的ライブラリは単独では実行できません。スタンドアロンアプリケーションは、静的ライブラリのセットにリンクしてもよく、その場合、それらのライブラリに定義されたシンボルはアプリケーションにアクセス可能となる。あなたはこのライブラリを構築する場合、あなたはhelper.a
のようなものになってしまいます
int func() {
printf("hi\n");
}
:
あなたの例を与えるために、あなたはhelper.h
に次の関数を宣言し、helper.c
でそれを定義する静的ライブラリを作成することができます独立して実行することはできません(int main()
はありません)が、1つまたは複数のスタンドアロンアプリケーションによってリンクすることができます。リンクされると、これらのアプリケーションにはhelper.h
が含まれ、func()
を実装しているかのようにfunc()
と呼び出すことができます。
最終的には、どちらを選択するかは、達成しようとしているものによって決まります。複数のアプリケーションがリンクして使用できるツールを作成しようとしていますか?その後、静的ライブラリを使用します。
ここでは "*一度リンクされると、それらのアプリケーションは単にhelper.hをインクルードし、func()を実装したかのようにfunc()を呼び出すことができます。*"順序が間違っています。ヘッダーをインクルードしてから(コンパイルしてから)ライブラリをリンクしてから、最後に 'func()'を呼び出すプログラムを実行してください。 – alk
そうです。彼の質問に基づいて、私はOPがXcodeを使用していると仮定していました。そこでは、リンクはビルド設定を介して行われます。 – Pejman
"*ビルド設定でリンクしています*"これはどのように必要な順序を変えますか?リンクはビルド中の*最後のステップです。 – alk
何ですか?これは文字通りリンゴとオレンジを比較しています。 –
必ずしも実行/開始(任意の)プログラムを実行するシェルは必要ありません。 – alk
理由がわからない理由同じコードをスタンドアロンアプリケーションまたは静的ライブラリの両方にコンパイルすることができます。私はそれらの違いを理解しようとしています。 – dwkns