web-dev-qa-db-ja.com

MinGWを使用したWindowsx64でのGNU Scientific Library(GSL)の使用

MinGWとMSYSをMicrosoftWindows(64ビット)のディレクトリC:\MinGW内にインストールしました(MSYSディレクトリはC:\MinGW\msys\1.0です)。最新のGNU Scientific Library(GNU GSL)パッケージを 公式ftp からダウンロードしました=。

GSLパッケージのconfigureファイルで説明されているように、MSYSを使用してmakeINSTALLを正常に実行しました。つまり、MSYSコマンドラインインターフェイスのMSYS homeディレクトリに、次のものを挿入しました。

$ ./configure
$ make
$ make install

これにより、MSYSディレクトリ(C:\MinGW\msys\1.0)の下にlocalディレクトリが生成されます。これには、ディレクトリbinincludelib、およびshareが含まれます。

GSLマニュアル の指示に従って、 サンプルプログラム ($ x = 5 $でベッセル関数$ J_0(x)$の値を計算します)を正常にコンパイルしました。 =、によって

$ gcc -Wall -I/usr/local/include -c example.c

これにより、予想どおり、エラーメッセージなしでオブジェクトファイルexample.oが生成されます。

instructions に従って、オブジェクトファイルがリンクされます。

$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm

これにより、MSYS環境で実行できる実行可能ファイルa.exeが生成されます。ただし、Windowsコマンドラインインターフェイスcmd.exeで、実行可能ファイルを実行しようとすると、次のエラーメッセージが表示されます。

コンピュータにlibgsl-0.dllがないため、プログラムを起動できません。この問題を解決するには、プログラムを再インストールしてみてください。

何が足りないのかしら?実行可能ファイルを作成するにはどうすればよいですか?

10
AlQuemist

MinGWのプロジェクトをビルドするときは、MSYSの下で、常に--prefix引数を./configureに指定する必要があります。 (/usr/localデフォルトはMSYS固有のパスを指定しますが、これはMinGWアプリケーション開発にはまったく適していません)。あなたの場合、GSLを次のように構成する必要があります。

./configure --prefix=C:/MinGW

または、さらに良いことに、ビルドファイルをソースから分離します(たとえば、GSLトップソースディレクトリのサブディレクトリとして):

mkdir build
cd build
../configure --prefix=C:/MinGW

これにより、パッケージによってインストールされたすべてのライブラリとヘッダーが、MinGWがそれらを見つけることができる適切なディレクトリに配置され、さらに重要なことに、MSYSの外部で実行されている場合、インストールされたDLLが%PATH%検索によって検出されます。

あなたが行ったように構成することによって、あなたがその後実行したとき

make
make install

mSYSで使用するためにMinGWライブラリとヘッダーをインストールしました(これは間違っています)。特にlibgsl-0.dllC:/MinGW/msys/1.0/local/binにインストールされますが、必要があります。 C:/MinGW/binにあります(後者のコマンドがインストールされている場所です。適切な--prefix=C:/MinGW仕様)。

重要な脚注

上記の手順では、MinGWで使用するためにGSL(または同様の方法で準備された他のライブラリ)が正しく準備され、開発ホスト(または同様のMinGWインストールを備えた他のホスト上)。ただし、そのようなアプリケーションを配布して(ライセンス条件に準拠している場合)、独立したアプリケーションとして実行できるようにする場合(つまり、MinGWをエンドユーザーのマシンにインストールする必要はありません)、 mustは、ディストリビューションで実行時の依存関係が適切に満たされるように注意してください。これを実現するには、次のいずれかを選択する必要があります。

  1. アプリケーションを静的にリンクします。配布が1つまたは2つの実行可能ファイルに制限されている場合、これは適切かもしれませんが、配布可能なアプリケーションスイート内で、共通のコアライブラリ依存関係を持つ実行可能ファイルの数が増えると、すぐに「実行可能ファイルの肥大化」につながります。後者の場合、より良い選択は
  2. アプリケーションを動的にリンクし、必要なDLL(システムDLLを除く)のコピーをアプリケーションスイートとともに配布します。この場合、エンドユーザーのマシンに適用される場合と適用されない場合があるディレクトリレイアウトまたは%PATH%設定に関して仮定を行うべきではありません。配信されたすべての実行可能ファイルとそれに付随するDLLが1つの同じディレクトリにインストールされるように、ディストリビューションをパッケージ化するだけです。
7
Keith Marshall

私は部分的な解決策も見つけました。それでも、なぜそれが機能するのか正確にはわかりません!

同じ手順と構成で、最初に質問で述べたように、Windows cmd(CLI)を使用し、Cコード(example.c)をコンパイルしてリンクする場合

gcc -c example.c -I"C:\MinGW\msys\1.0\local\include" -Wall
gcc -static example.o -L"C:\MinGW\msys\1.0\local\lib" -lgsl -lgslcblas -lm

またはC++コード(example.cと同等)と

g++ -c example.cpp -I"C:\MinGW\msys\1.0\local\include" -Wall
g++ -static example.o -L"C:\MinGW\msys\1.0\local\lib" -lgsl -lgslcblas -lm

つまり、リンクで-staticオプションを使用すると、すべてが完全に機能し、最終的な実行可能ファイルがエラーメッセージなしで実行されます。したがって、問題は動的ライブラリのリンクに関係しているようです。

私が間違っている場合は私を訂正してください。

1
AlQuemist

コンパイルしたライブラリlibgsl-0.dllがシステムまたはユーザーパス上にないため、実行可能ファイルはWindows cmdでは実行されません。 Windowsはそれを探す場所を知りません。直接の解決策は、libgsl-0.dllの場所を含めるように環境変数PATHを編集して、システムにそれを見つける場所を指示することです。これは、cmdを使用して次のように入力することで実行できます。

PATH=PATH;path-to-libgsl-0.dll

コマンドラインで。 (ライブラリがどこに配置されるかを正確に覚えていないので、具体的でないことをお許しください。)ただし、これはセッションの間だけ続きます。変更を永続的にするには、コントロールパネルを使用してPATH変数を編集する必要があります。 。環境変数にアクセスする1つの方法は、ウィンドウの左側にある[システムの詳細設定]をクリックすることです。これは、[コントロールパネル]-> [システムとセキュリティ]-> [システム]をクリックするか、[スタート]で[コンピューター]を右クリックします。メニューとプロパティの選択。 「システムの詳細設定」をクリックするとウィンドウが開き、「環境変数」ボタンが表示され、そのボタンをクリックすると環境変数にアクセスできるようになります。ただし、PATHを編集するには、 ここ にあるフリーウェアユーティリティ「PathEditor.exe」を使用することをお勧めします。このユーティリティを使用すると、プロセスがはるかに簡単になります。

ただし、ビルド設定は最適にはほど遠いです。オプションを指定せずに.configureステップを使用すると、生成されたファイルがC:\ MinGW\msys\1.0\localにインストールされ、複数のディレクトリに分散されます。他の開発ライブラリもインストールした後で新しいバージョンのGSLをインストールする場合、ファイルを削除するのは困難です。オプション--prefix=C:/MinGW/gsl.configureステップに追加することをお勧めします。 (オプションの完全なセットについては、.configure --helpを実行してください。)これにより、C:\ MinGW\gslを削除または名前変更するだけで、必要に応じてインストールを簡単に実行できます。さらに、MSYSの目的は、GNUシステムを対象としたソフトウェアのビルドを容易にすることです。これはWindowsの方法ではありません。一度ビルドされたソフトウェアは、MSYSの下ではなく、C:\ MinGWおよびcmdまたは他の適切なWindowsツールを使用してネイティブWindowsプログラムをビルドするために使用されるC:\ MinGW\binのビルドツールにアクセスできるようになりました。これは、実際には、MSYSの場合は常に--prefix=C:/MinGWを使用する必要があることを意味します。この場合のGSLヘッダーファイルとライブラリのように、MinGWで使用するソフトウェアをビルドするために必要です。ただし、与えられた理由から、--prefix=C:/MinGW/softwareを選択することをお勧めします。

ソフトウェアがインストールされたら、システムが必要なライブラリを見つけることができるように、PATHを編集することを忘れないでください。

0
gostal

それほど単純ではありません。 gccは、bashシェルのLINUXコマンドプロンプトから実行されます。 MinGW32-gccは、cmd.exeシェルのDOSコマンドプロンプトから実行されます。ダイナミックリンクライブラリ(DOSの場合は.dll、Linuxの場合は.so .la)を必要とするプログラムを実行するために必要なダイナミックリンクもOSに依存します。 LinuxダイナミックライブラリとWindowsダイナミックライブラリは互換性がありません。これだけが予想されます。ただし、Linuxのbashシェルでgccとldによって作成された静的ライブラリは、Windowsのcmd.exeシェルのMinGW32-gccと互換性がないようで、これには驚かされます。 MinGW32-gccをlibgsl.aにリンクさせることができません。 ldから未解決の参照を取得し続けます。また、GSLをcmd.exeシェルでビルドする方法もわかりません。

0
Byron