おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

gtkglextmm のコンパイルメモ(回想)

gtkglextmm のコンパイル方法について質問メールが過去 2 回ほど来たので、ここで簡単に紹介します。ただ、私がコンパイルしたのは 1 年以上前のことであるため、 gtkglexmm のバージョンが新しくなっている可能性があります。私は最近は gtkglexmm を使っていないので、新しいバージョンについては分かりません。また、1年以上前ということで、細かいところについては、抜けている部分もあるかと思います。全体的な流れ、コンパイルの方針としてこの記事を読んでいただければと思います。

前置きはこの辺にして、本題に進みます。私のコンパイルしたときの環境です。
コンパイラ: Visual C++ 2005 Express Edition (以降 VC と呼びます)
gtkmm: gtkmm-devel-2.8.8-2.exe
gtk+: 上記の gtkmm 対応するバージョン、それに含まれる gtkglext を使いました。
gtkglextmm: gtkglextmm1.2

全体の流れとしては
1. configure スクリプトを実行する。gdkglextmm-config.h が生成される。
2. VC でコンパイルが通るようにソースコードを修正する。
3. 1回目のビルド。 obj ファイルが生成される。
4. obj ファイルからすべてシンボルを抽出して、 def ファイルに書き出す。
5. 2回目のビルド。DLL プロジェクトとして、 def ファイルを使って DLL にシンボルをエクスポートする。
※ 3、4、5 については C++ で DLL 化するテクニックです。ただし、生成された DLL はコンパイラ間のバイナリ互換性がないので、 VC で生成した DLL は VC からしか使えません。(ソースのコーディングにいくつか制約を設ければ、バイナリ互換性得られますが。 COM とか。)

もう少し、各項目について詳しく見ていきます。
1. configure スクリプトを実行する。
gtkglextmm を configure すると、gdkglextmm-config.h というファイルが生成されて、環境に応じたマクロが定義されます。私は、最初に Linux 環境で configure を通して生成された gdkglextmm-config.h を configure.in を見ながら Win32 用に書き換えました。次のようなコードになりました。

001 /* gdkglextmm-config.h
002  *
003  * This is a generated file.  Please modify `configure.in'
004  */
005 
006 #ifndef GDKGLEXTMM_CONFIG_H
007 #define GDKGLEXTMM_CONFIG_H
008 
009 #include <gdkglext-config.h>
010 
011 
012 #define GDKGLEXTMM_WINDOWING_WIN32
013 
014 #define GDKGLEXTMM_MULTIHEAD_SUPPORT
015 
016 #if !defined(GDKGLEXT_MULTIHEAD_SUPPORT) && defined(GDKGLEXTMM_MULTIHEAD_SUPPORT)
017 #error "Installed GdkGLExt library doesn't have multihead support."
018 #endif
019 
020 #endif /* GDKGLEXTMM_CONFIG_H */

configure するのは、 Linux 環境じゃなくても、 Cygwin や MSYS でも良いと思います。

2. VC でコンパイルが通るようにソースコードを修正する。
drawable.h, context.h の
   #include <GL/gl.h>
の手前に、
   #ifdef G_OS_WIN32
   #define WIN32_LEAN_AND_MEAN 1
   #define NOMINMAX
   #include <windows.h>
   #endif
を追加しました。

3. 1回目のビルド。
VC のプロジェクトを使ってビルドします。プロジェクトの種類は DLL とします。
デバッグ版、リリース版の両方をビルドすると思いますが、このとき、リリース版 の方はプロジェクトのプロパティのC/C++の最適化の設定で "プログラム全体の最適化" は必ず "いいえ" とします。こうしないと、次の作業で、オブジェクトファイルからシンボルを取り出せません。私は出力される DLL 名を、リンカの全般の出力ファイルの設定で gtkglextmm-1.2d.dll(デバッグ版)、gtkglextmm-1.2.dll(リリース版) と指定しました。

4. obj ファイルからすべてシンボルを抽出して、 def ファイルに書き出す。
gtkmm のソースの中の MSVC_Net2003 というフォルダの中に gendef というユーティリティがあります(gtkmm はどのバージョンでも多分入っていると思います)。ソースのままだと思うので、コンパイルして使います。これは、 VC に含まれる dumpbin というコマンドを利用して、 obj ファイル内のすべてのシンボルを def 形式で書き出すユーティリティです。 obj ファイルはたくさんあるので、次のような感じにバッチファイルを作って実行すると楽です。

gendef.exe debug.def gtkglextmm-1.2d.dll ^
  Debug\config.obj ^
  Debug\context.obj ^
  ...(すべての obj ファイル)

gendef.exe release.def gtkglextmm-1.2.dll ^
  Release\config.obj ^
  Release\context.obj ^
  ...(すべての obj ファイル)

5. 2回目のビルド。
リンカの入力のモジュール定義ファイルとして、生成した def ファイルを指定し、もう一度ビルドします。

以上で、DLL と LIB ファイルが生成されます。 gtkglextmm のコンパイルは完了です。(DLL と LIB の使い方については色々解説ページがあると思うので、省略です。) gtkmm のプロパティシート gtkmm-2.4.vsprops に LIB ファイルを追加しておくと便利だと思います。

本当に、だいぶ前にやっていたことなので何か抜けていたらごめんなさい。
  1. 2008/06/28(土) 07:27:23|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0
<<trueSpace 7.6 という 3D モデリングソフトがフリーに。へぇ~ | ホーム | Verilog の暗黙のネットを無効にする>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/224-aa99647a
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。