ランタイムライブラリ#

簡単なプログラムでさえ外部のランタイムライブラリに依存していることを示すために、このような依存関係を報告するlddユーティリティからの出力を次に示します。

$ ldd tabulate.exe
        ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ff88f2b0000)
        KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ff88e450000)
        KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ff88b9e0000)
        cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)
        cyggfortran-5.dll => /usr/bin/cyggfortran-5.dll (0x3efd20000)
        cygquadmath-0.dll => /usr/bin/cygquadmath-0.dll (0x3ee0b0000)
        cyggcc_s-seh-1.dll => /usr/bin/cyggcc_s-seh-1.dll (0x3f7000000)

他のコンパイラまたは同じコンパイラの他のバージョンでは、異なる動的ライブラリが必要になる可能性があります。プログラムを同じコンピュータ(または、より正確には、同じ環境内)で実行している限り、問題はないはずです。ただし、このようなライブラリが見つからない場合は、(うまくいけば)エラーメッセージが表示され、プログラムはすぐに停止します。

したがって、どのライブラリが必要かを知っておくことは良いことです。 LinuxおよびLinuxのような環境では、lddユーティリティが非常に役立ちます。 Windowsでは、dependency walkerを使用することをお勧めします(Windows 10で非常にうまく機能する最新バージョンは、こちらにあります:https://github.com/lucasg/Dependencies

もう1つ知っておくべきことは、プログラムがこれらのライブラリを見つけようとする場所です。 それはそれ自体が広大な主題であり、複雑さと歴史に満ちています。 ここでは、ほんの表面をなぞるだけです。

Linuxの場合

  • 環境変数LD_LIBRARY_PATHが使用されます。 これは、検索されるディレクトリのリストで構成されており、各ディレクトリはコロン(:)で区切られています。 たとえば、/usr/lib:/usr/local/lib — 一般的なシステムディレクトリです。

  • リンクステップでは、RPATHを設定するオプションも使用できます。これは、実行可能ファイル自体に配置されるディレクトリのリストです。

  • 次に、検索されるいくつかのシステムディレクトリがあります。

Windowsの場合

  • 実行可能プログラムを含むディレクトリには、動的ライブラリも含まれている場合があります。

  • 環境変数「PATH」が使用されます。これも検索されるディレクトリのリストですが、区切り文字はセミコロン(;)です。

  • 一連のシステムディレクトリが検索されます。

残念ながら、詳細はオペレーティングシステムのバージョンによって変わる可能性があります。上記は単なる目安です。「ldd」や「dependency walker」などのツールを使用して、どのライブラリがロードされ、どこで見つかったかを確認してください。

プログラムを同僚、クライアント、または世界中のユーザーと共有したい場合は、プログラムに加えて、依存するライブラリも配布するように注意する必要があります。詳細については、以下を参照してください。