4

C ++コードからLinuxプログラムを呼び出したいsystemのですが、最初にプログラムがユーザーのマシンにインストールされているかどうかを確認したいと思います。

Ubuntuでは、そのプログラムに関連付けられたパッケージがのようなシステムコールを使用してインストールされたかどうかを判断し、dpkg -s gifsicleその出力を解析できます。gifsicleこれがプログラム名です。

ただし、プログラム(例gifsicle)がソースからコンパイルされたため、Ubuntuパッケージリポジトリに表示されない可能性があります。

gifsicleC ++コードを実行しているシステムでプログラム(例)が利用可能かどうかを判断するための優れたプログラム的な方法は何ですか?

4

5 に答える 5

4

which最初に呼び出すことができます。

終了ステータスは、パス上で指定された実行可能ファイルを見つけることができたかどうかを示します。

于 2011-08-12T20:22:56.163 に答える
2

Linuxには標準のパッケージマネージャーがないのでdpkg、間違いなく間違った答えです。

セキュリティと正確さの理由から、実行可能ファイルを見つけるためにユーザーのPATHに依存することはおそらく賢明ではありません。/usr/bin/gifsicleしたがって、への呼び出しでは、おそらくすでに完全修飾パス(たとえば)を使用しているはずですsystem

もしそうなら、あなたの質問への簡単な答えは次のとおりです。

if (access("/usr/bin/gifsicle", X_OK) == 0) {
    system("/usr/bin/gifsicle -my -args");
}
else if (errno == EACCESS) {
    /* gifsicle not found */
}
else {
    /* access() failed!  Operating system is broken or Windows (or both) */
}

/usr/bin/gifsicle(変数に入れるとボーナスポイント)

より難しい-しかし間違いなく「より正しい」-答えは、自分自身を避けて実行し、結果が同じかどうかを確認するsystemことです。ただし、失敗を親プロセスに戻すのは面倒な場合があります。forkexeclexeclENOENT

于 2011-08-12T20:48:53.950 に答える
1

基本的に、プログラムが手動でインストールされ、インストールされたパッケージデータベースに登録されていない場合をカバーするには、ファイルシステム全体をスキャンして、プログラムがインストールされていないことを確認する必要があります。

プログラムがユーザーのPATHにあることが確実な場合は、whichコマンドを呼び出すことができます(これも使用しsystem()ます)。

ただし、これに対する一般的な解決策は、ユーザーが構成オプションを介して実行可能ファイルへのパスをオーバーライドできるようにすることです。たとえば、Doxygenは、ドットを呼び出して図を生成するように構成できます。デフォルトでdotは、PATH環境変数の場合と同じように呼び出そうとします。dot見つからない場合は、プログラムが見つからないこと、およびDOT_PATH構成値が設定されていないことをユーザーに警告します。このソリューションには、シンプルで他のシステムでも機能するという利点があります。

于 2011-08-12T20:27:42.277 に答える
0

あなたが言うように、何かがインストールされているかどうかを判断するのは簡単ではありません。実際、「インストール済み」の明確な定義はありません。パッケージマネージャーは近づきますが、すべてがパッケージマネージャーを通過するわけではありません。

実行可能ファイルを呼び出そうとしないのはなぜですか?呼び出しが失敗systemし、実行可能ファイルが見つからなかったことを示している場合は、実行可能ファイルがインストールされていないか、利用できない、またはその両方であると推測します。どちらが重要ですか?—そしてフォールバックの代替案に移ります。

于 2011-08-12T20:31:13.537 に答える
-3

設定スクリプト(または同様のもの)を作成しようとしているようです

autoconfを参照してください

http://www.linuxselfhelp.com/gnu/autoconf/html_chapter/autoconf_3.html

于 2011-08-12T20:27:03.833 に答える