10

あるLinuxボックスでHaskellプログラムをコンパイルしてから、別のLinuxボックスで実行したいと思います。ただし、これはまったく機能していないようです。ライブラリが見つからないというエラーが発生します。

おそらく、GHCをインストールすると、パッケージマネージャーは必要なすべてのライブラリやものもインストールします。[少なくとも1つのパッケージングシステムがGCCのインストールに失敗し、GHCがないと機能しないようです...]しかし、もちろん、ターゲットシステムにはこれらの依存関係がインストールされていません。したがって、コンパイルされたバイナリをターゲットシステムにコピーすると、実行に失敗します。

この問題を回避する方法はありますか?私はWindowsでの作業に慣れています。何かをコンパイルすると、すべてのWindowsシステムで動作します(少なくとも、データベースアクセスなどの非標準機能を実際に使用しようとするまでは機能します...)Hello WorldをHaskellでコンパイルし、別のLinuxボックスにコピーすると、libgmp.so.10が見つからないか、そのようないくつかの不可解なmumbo-jumbo。

面白いことに、私はターゲットマシンへのFTPアクセスしか持っておらず、シェルアクセスは持っていません。実行しているOSが完全にはわかりません。したがって、ビルドマシンを好きなように変更できますが、ファイルをターゲットマシンにコピーする以外に、ターゲットマシンに対して何もできません。

4

2 に答える 2

10

Linuxは、この点でWindowsと同じように動作します。LinuxでHaskell実行可能ファイルをコンパイルすると、適切なライブラリを備えた任意のLinuxディストリビューションで実行されます。問題は、Windowsでは、Haskell実行可能ファイルが動的バージョンのlibgmpでコンパイルされていないことです。実行可能ファイルを配布するときにWindowsでdllを処理するのが非常に難しいため、静的バージョンでコンパイルされます(ライブラリが実行可能ファイルにコンパイルされるように)。Linuxでの新しいライブラリのインストールは比較的簡単に処理できます。

できることは、libgmp.so.10(別のファイルへのシンボリックリンクである可能性があります)を/ usr/libから実行可能ファイルと同じディレクトリにコピーすることです。次に、実行可能ファイルを起動する前に、LD_LIBRARY_PATH環境変数を「。」(現在のディレクトリを意味する)に設定できます。これにより、Linuxは起動した実行可能ファイルと同じディレクトリでライブラリを検索し、ライブラリを検索します。これは、ランチャースクリプトを使用して実行できます。

#!/bin/sh
export LD_LIBRARY_PATH=.
`dirname "$0"`/myexecutable "$@"

このスクリプトを保存し、で実行可能としてマークすると、実行chmod +x myscript可能ファイルが機能します。

このlddコマンドを使用して、実行可能ファイルに必要な他のライブラリと、ターゲットシステムにないライブラリを確認できます。

于 2012-07-19T19:12:02.040 に答える
0

マシン間で実行可能ファイルを移動する場合は、静的にリンクして、外部ライブラリに依存しない単一の実行可能ファイルを作成する必要があります。それを行う方法はコンパイラに依存し、ghcには「haskellライブラリの静的バージョンをリンクする」-staticフラグがあります。

ところで、32ビットマシンで64ビット実行可能ファイルを実行しようとしないことを確認してください。ほとんどの場合、64ビットマシンで32ビットの実行可能ファイルが機能するはずですが...まあ、それはターゲットボックスの構成に依存するので、これも当てはまらないことを確認してください。

于 2012-07-19T20:13:05.067 に答える