[Gtklab-devel] GTK+のコンパイル環境について

Back to archive index

Kazuki IWAMOTO iwm****@maid*****
2004年 10月 19日 (火) 05:22:41 JST


 以前にも少し話が出たVisual C++ Toolkit 2003ですが、一部の改変で2.4.11.0を
コンパイルできることを確認しました。

 Visual C++ Toolkit 2003のインストールですが、「Visual C++ Toolkit 2003」を
キーワードにして検索すれば、日本語で説明したサイトを見つけることができます。
Visual C++ Toolkit 2003自体のインストールで困ることはないと思います。

 しかしVisual C++ Toolkit 2003単体ではWindowsのAPIを呼び出す
アプリケーションプログラムは作成できません。Microsoft Windows Platform SDKが
必要になります。ですが、Visual C++ Toolkit 2003のインストールについて
説明しているサイトならば、Microsoft Windows Platform SDKについても
言及していると思います。

 ここまでは問題ないのですが、GTK+のようなライブラリ(DLL)を作る場合、
さらに作業が必要です。GTK+ではC言語のランタイムライブラリを動的に
リンクしています。実行時に動的にリンクするためにはのインポートライブラリ
(msvcrt.lib)が必要なのですが、msvcrt.libはVisual C++ Toolkit 2003にも
Microsoft Windows Platform SDKにも含まれていません。
 実はmsvcrt.libはMicrosoft .NET Framework SDK v1.1に含まれています。
Microsoft .NET Framework SDK v1.1のインストールと設定も必要になります。

 さらにこれがまた曲者で、このmsvcrt.libはmsvcrt.dllのインポートライブラリ
ではなく、msvcr71.dllへのインポートライブラリです。Microsoft的には
アプリケーションプログラムがmsvcrt.dllを使うのは良くないらしいです。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_c_run.2d.time_libraries.asp
msvcr71.dllがmsvcrt.dll並に普及していれば問題ないのですが...。
 Microsoftの説明を見る限り、これはMicrosoft .NET Framework SDK v1.1に
限ったことではなく、他の入手方法(例えば製品パッケージのVisual C++ .NET 2003)
でもmsvcrt.libはmsvcr71.dllへのインポートライブラリのようです。
 現状でこれを真っ当に回避するには、msvcrt.libがmsvcrt.dllの
インポートライブラリになっている古い製品(例えばVisual C++ 6.0)を
使う以外には方法はなさそうです。

 ここまで巧く環境を設定してもGlibのgatomic.cにあるInterlockedCompareExchange
というAPIで問題が発生します。このInterlockedCompareExchangeはバイナリレベルでは
互換性が保たれていますが、ソースレベルで互換性が保たれていません。
GLibは少なくともFebruary 2003より前のSDKを前提に作られているようです。
SDKのヘッダファイルではInterlockedCompareExchangeの引数と戻り値の型が
変更されているため、コンパイル時にエラーになります。
 gatomic.cを改変すればコンパイルできるようになります。


 私の見解としては、
Visual C++ 6.0(コンパイラ、リンカ、nmake、C言語ランタイムライブラリ)
Microsoft Windows Platform SDK February 2003(ヘッダファイル、インポートライブラリ)
という組み合わせがバイナリを作る上で最良だと考えています。しかし
Visual C++ Toolkit 2003(コンパイラ、リンカ)
Microsoft Windows Platform SDK February 2003(ヘッダファイル、インポートライブラリ、nmake)
Microsoft .NET Framework SDK v1.1(C言語ランタイムライブラリ)
という組み合わせでもmsvcr71.dllにリンクされることを気にしなければ問題ないと
思います。
 特に後者の組み合わせならば、すべて容易に入手可能です。


 以降、問題を整理したいと思います。


岩本一樹
iwm****@maid*****



Gtklab-devel メーリングリストの案内
Back to archive index