DelFEM のサンプルをコンパイルしてみたメモ

2009年2月2日

DelFEM

DelFEM 1.1.12 (ここ から入手)

前から変わったところ

コンパイルに関しては、ソースコードおよびサンプルコードのインクルードファイルが直接の参照でなくなっている。

Visual Studio .NET 2003 Standard Edition によるコンパイル

GLUT のセットアップ

ここ から glut-3.7.6-bin.zip を入手する。ファイルを以下の場所に入れる。

  • glut32.dll → C:\WINDOWS\System
  • glut32.lib → C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\lib
  • glut.h → C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\include\GL

DelFEM のコンパイル

  1. DelFEM のパッケージを適当なところに展開。
  2. たとえば test_glut\solid3d に入り、solid3d.dsw を開く。
  3. "変換してこのプロジェクトを開きますか?" と聞かれるので、"すべてはい" を選ぶ。
  4. すべてのプロジェクトに対して、インクルードパスとして include フォルダを追加する。
  5. ビルド。

つまづいた。

drawer_field_image_based_flow_vis.cpp の以下の箇所を変更。226 行目

int phase = ( abs(i % 16) < 3 || abs(j % 16) < 3 ) ?  0 : 255;
および 244 行目
int phase = ( abs(i % 16) < 3 && abs(j % 16) < 3 ) ?  0 : 255;
これらをそれぞれ次のように書き換える。
int phase = ( abs((int)(i % 16)) < 3 || abs((int)(j % 16)) < 3 ) ?  0 : 255;
int phase = ( abs((int)(i % 16)) < 3 && abs((int)(j % 16)) < 3 ) ?  0 : 255;

abs() のオーバーロードの解決ができないということだったが… % 演算子の結果ってもとから整数型じゃないの? わからん。これだから MS は…。

MinGW でコンパイル

MinGW 5.1.4, GCC 3.4.5。

GLUT のセットアップ

ここ から GLUT-MinGW-3.7.6-4.mp.zip を入手。ファイルを以下の場所に入れる。

  • libglut32.a → C:\MinGW\lib
  • glut.h → C:\MinGW\include\GL

DelFEM のコンパイル

ホームディレクトリ以下 (C:\msys\1.0\home 以下) に DelFEM のパッケージを展開し、ディレクトリに入る。今回はコンパイル用のバッチファイルが用意されている。

…MSYS からバッチファイルってどうやって実行するんだっけ? しばらく悩んだ末、以下のようにした。

$ cmd /c make_with_mingw.bat

結果オーライ。サンプルのコンパイルは以下のようにした。

$ cd test_glut
$ make

Linux でコンパイル

Fedora 9 x86_64、GCC 4.3.3 (OpenFOAM 付属)。

GLUT のセットアップ

freeglut が入っていたので、freeglut-devel を入れる。

DelFEM のコンパイル

そのままでは上手くいかない。どうやらファイル名の大文字・小文字の整合性が完全にはとれていない (Windows では大文字・小文字が区別されないので問題にならない)。

パッケージを展開し、ディレクトリに入る。Makefile にインクルードパスを追加。

INCLUDES = -Iinclude

これだけだとインクルードパスは追加されないので、次の箇所を修正する。

Lib/%.o : %.cpp
        $(CXX) $(CXXFLAGS) -c -o $@ $<

これに "$(INCLUDES)" を追加。

Lib/%.o : %.cpp
        $(CXX) $(CXXFLAGS) $(INCLUDES) -c -o $@ $<

Makefile で "Lib" と書いてあるものが Linux では "lib" となっているので、Makefile 中のすべての "Lib" を "lib" に書き換える。vi なら以下のように打てばよい。

:%s/Lib/lib/g

また、OBJS の中の "zsolver_ls_Iter.o" も後で問題になるので "zsolver_ls_iter.o" に書き換える。以上で Makefile の準備は OK。

これで make を実行すると、include/delfem/camera.h 中でインクルードしている "Vector3D.h", "Quaternion.h" がないと言ってくるので、camera.h のインクルード文を次のように書き換える。

//#include "Vector3D.h"
//#include "Quaternion.h"
#include "vector3d.h"
#include "quaternion.h"

同様のことを include/delfem/quaternion.h でも言われるので、同様に書き換える。

//#include "Vector3D.h"
#include "vector3d.h"

同様のことを src/com/drawer.cpp でも(ry

続けていってもいつ終わるとも知れないので、スクリプトでやっつけることにした。

tolower_include

#!/bin/sh

TARGET=DelFEM1.1.12
COPY=$TARGET-copy

cp -r $TARGET $COPY

FILES=`find $TARGET | awk '/\.h$/{print} /\.cpp$/{print}'`

for FILE in $FILES; do
	echo $FILE_COPY
	FILE_COPY=`echo $FILE | sed -e "s/$TARGET/$COPY/"`
	cat $FILE | awk '/#include "/{print tolower($0)} \
	  !/#include "/{print}' > $FILE_COPY
done

このスクリプトを実行すると、DelFEM1.1.12 ディレクトリを DelFEM1.1.12-copy にコピーし、そのうち *.cpp ファイルと *.h ファイルの #include "..." 文を小文字に書き換える。

はじめからやりなおし。

$ unzip DelFEM1.1.12.zip
$ ./tolower_include
$ cd DelFEM1.1.12-copy
(ここで Makefile を修正する)
$ make

src/com/drawer_gl_utility.cpp で atoi がどうとか言われるので、drawer_gl_utility.cpp に次のインクルード文を追加。

#include <cstdlib> // atoi

続いて、次のようなエラーが出る。

include/delfem/mesher2d.h:250: error: extra qualification ‘Msh::CMesher2D::’ on member
 ‘GetTriMesh_Around’

以下の箇所。

bool CMesher2D::GetTriMesh_Around(
                std::vector< CTriAround >& aTriAround,
                unsigned int ibarary, 
                unsigned int ibar, unsigned int inobar, bool is_left,
                const std::vector<unsigned int>& aFlgMshCut );

メンバ関数にクラス名がくっついているのがいけないようなので、消す。

bool GetTriMesh_Around(
                std::vector< CTriAround >& aTriAround,
                unsigned int ibarary, 
                unsigned int ibar, unsigned int inobar, bool is_left,
                const std::vector<unsigned int>& aFlgMshCut );

make は無事終了。続いてインストール。

$ su
# cp -r include/delfem /usr/local/include
# cp lib/libdfm.a /usr/lib64
# exit

いよいよサンプルのコンパイル。

$ cd test_glut/solid3d
$ make
$ ./main.exe