2016-05-12 10 views
0

私はかなり初心者プログラマーです。しかし、私はLinux開発をしたい。しかし、すべての私の大学のコース(Javaのものを除く)はWindows向けでした。だから私たちは決してパッケージングを行う必要はありませんでした。しかし私は自分のプログラムをLinux用にパッケージ化したい(Debと多分RPM)。Linuxの開発:自分のプログラムの依存関係を知る方法は?

私のソースコードをスキャンして依存関係を提案するツールはありますか?

'hello world' Cプログラムの依存関係は何でしょうか? 'hello world' Javaプログラムの依存関係は何でしょうか? あなた自身の依存関係を認識するためのチュートリアルはありますか?

+0

私は、あなたが1つの言語を選び、そのパッケージマネージャーについて学ぶ必要があると思う - Maven for Javaを見ることができるようにするために – Lee

+0

あなたが質問すれば 'どのような言語? 'を使用すると、私はちょうど経験を持って来るのが怖いです。それは実際には「示唆」的なものではなく、「定義する」ものです。 – Lee

+0

rpmまたはdebパッケージを作成しようとしていますか: – padippist

答えて

0

一般に、#includeライブラリのヘッダーをアクティブに選択するため、プログラムの依存関係がわかります。ヘッダーがlibfoo-devというDebianパッケージから来た場合、ランタイム依存関係は通常libfooになります。さらに、実行するために実行時にシステムにインストールする必要があるため、system/execveを使用して呼び出した実行可能ファイルに依存します。

Javaの場合、リポジトリに追加できるファイルはjarに依存している点で似ています。 MavenやGradleなどのビルドシステムを使用している場合は、Maven/Gradleがコンパイルおよび実行時に使用できるように、依存関係のセットをすでに持っています。同様に、ProcessBuilderを使用して呼び出すJNIライブラリ+バインディングまたは実行可能ファイルも依存関係になります。

1

コンパイルされたバイナリの場合は、lddをご覧ください。実行可能ファイルをロードするために使用される動的ライブラリのファイル名を示します。それらのライブラリがどのパッケージに属しているかを調べるには、パッケージマネージャのwho-ownsコマンドを使用する必要があります。

> ldd hello 
     linux-vdso.so.1 (0x00007fff7b5fb000) 
     libc.so.6 => /usr/lib/libc.so.6 (0x00007fa6b1d96000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fa6b2137000) 

> pacman -Qo /usr/lib/libc.so.6 /lib64/ld-linux-x86-64.so.2 
/usr/lib/libc.so.6 is owned by glibc 2.23-2 
/usr/lib/ld-linux-x86-64.so.2 is owned by glibc 2.23-2 

この場合、唯一の依存性はglibcパッケージです。

このようにして、特定の種類の依存関係のみが見つかります。 ライブラリがなくても、バイナリは起動しませんが、動的ライブラリではない追加の依存関係が存在する可能性があります。特に、実行可能ファイルが他のパッケージのファイルに対してopen()、dlopen()、exec()またはcall system()を試行した場合、出力はlddには表示されません。

ライブラリの場合でも、lddは間接的な依存関係は気にせず、ロードされたものすべてをリストします。 readelf -d hello | grep NEEDEDのようなものを使用すると、少しばかり明らかになることがあります。

一部のパッケージマネージャー(RPM)は、パッケージの作成時にこの種のチェックを行い、見つかったすべての依存関係を追加します。他はしません。

関連する問題