MinGWとMSYSをMicrosoftWindows(64ビット)のディレクトリC:\MinGW
内にインストールしました(MSYSディレクトリはC:\MinGW\msys\1.0
です)。最新のGNU Scientific Library(GNU GSL)パッケージを 公式ftp からダウンロードしました=。
GSLパッケージのconfigure
ファイルで説明されているように、MSYSを使用してmake
とINSTALL
を正常に実行しました。つまり、MSYSコマンドラインインターフェイスのMSYS home
ディレクトリに、次のものを挿入しました。
$ ./configure
$ make
$ make install
これにより、MSYSディレクトリ(C:\MinGW\msys\1.0
)の下にlocal
ディレクトリが生成されます。これには、ディレクトリbin
、include
、lib
、および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がないため、プログラムを起動できません。この問題を解決するには、プログラムを再インストールしてみてください。
何が足りないのかしら?実行可能ファイルを作成するにはどうすればよいですか?
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.dll
はC:/MinGW/msys/1.0/local/bin
にインストールされますが、必要があります。 C:/MinGW/bin
にあります(後者のコマンドがインストールされている場所です。適切な--prefix=C:/MinGW
仕様)。
重要な脚注
上記の手順では、MinGWで使用するためにGSL(または同様の方法で準備された他のライブラリ)が正しく準備され、開発ホスト(または同様のMinGWインストールを備えた他のホスト上)。ただし、そのようなアプリケーションを配布して(ライセンス条件に準拠している場合)、独立したアプリケーションとして実行できるようにする場合(つまり、MinGWをエンドユーザーのマシンにインストールする必要はありません)、 mustは、ディストリビューションで実行時の依存関係が適切に満たされるように注意してください。これを実現するには、次のいずれかを選択する必要があります。
%PATH%
設定に関して仮定を行うべきではありません。配信されたすべての実行可能ファイルとそれに付随するDLLが1つの同じディレクトリにインストールされるように、ディストリビューションをパッケージ化するだけです。私は部分的な解決策も見つけました。それでも、なぜそれが機能するのか正確にはわかりません!
同じ手順と構成で、最初に質問で述べたように、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
オプションを使用すると、すべてが完全に機能し、最終的な実行可能ファイルがエラーメッセージなしで実行されます。したがって、問題は動的ライブラリのリンクに関係しているようです。
私が間違っている場合は私を訂正してください。
コンパイルしたライブラリ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を編集することを忘れないでください。
それほど単純ではありません。 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シェルでビルドする方法もわかりません。