2017-03-24 21 views
4

前文

これは潜在的にxy problem可能性があり、私はこれにアプローチするより良い方法がある場合、元の質問から外れるの提案に開いています。私が必要埋め込みC内の別のプログラムにプリコンパイルされたアプリケーション


問題

私はメトリクス、統計情報の多くを生成し、かなり大規模なプログラムを持っている、など一つの重要な計算は複雑な数学的操作の出力を生成する機能です。この出力を生成できる唯一のツールは、サードパーティのベンダー提供のアプリケーションです。ベンダーはOS/distory/architectureのために私の会社のアプリケーションを喜んでコンパイルしますが、ソースを与えることはできません。結果として、私たちのプログラムは、同じプロジェクトの一部として出荷されるプリコンパイルされたプログラムと、popen()によって開始されるベンダープログラムに依存しなければなりません。

インストールの不具合などの理由で、popen()の呼び出しがパスの問題やファイルの移動などによって失敗することがあります。これらは制御できるものではありませんが、顧客はdevs。いくつかの方法は、プログラム上の簡単なプラスを使用して、それがプライベートメモリマッピングでpopen()「EDになることができるように何とか私たち自身のアプリケーションに外部アプリケーションを埋め込むために、


質問

ありますそのため、プログラムは常に「メイン」アプリケーションで利用できますか?

理想的には、このプログラムのソースを独自のコードベースに追加して問題を解決するだけですが、それは私たちにとっては不可能です。

+4

スタンドアロンアプリケーションではなくライブラリとしてコンパイルできませんか? –

+0

@ChrisDodd残念ながら、そうではありません。彼らはライブラリとしてそれを出荷することはできません。 – DevNull

+0

確かに、彼らはライブラリとして出荷することはできません。 – chux

答えて

4

をリンカーを使用してバイナリ全体をアプリケーションにリンクします。 Linux/ELF/ldの詳細はin this answerです。

実行時にバイナリをテンポラリファイルに書き込んでから、chmod(2)をプログラムに含めて実行し、最後にpopenを実行しています。


それは要件ではない場合、ベンダーが提供するアプリケーションだけ存在しなければならない他のauxillaryのファイルとして扱うことができるからです。私は、顧客があなたのアプリケーションディレクトリ内の他のファイルよりも実行可能ファイルをどのように混乱させるかを見ていません。

1

これは実際に興味深い質問です。私はあなたのプログラムの中に実行可能ファイルを含めることです。最も簡単な方法は、実行可能ファイルの内容のコピーであるcharの配列を作成することです。実行時にmkstempを使用してテンポラリファイルを作成し、char配列の内容を書き込むことができます。その後、実行許可をchmodで追加し、先ほどと同様にpopenで実行します。

私が説明してるだけで何をするコードの例を提供し、このSO質問が見つかりました:ちょうどあなたができる、あなたが本当にauxillaryファイルせずに、単一のバイナリとしてアプリケーションを出荷する必要がある場合はHow to compile and execute from memory directly?

関連する問題