DelFEM のサンプルをコンパイルしてみたメモ2009年2月2日 | |
DelFEMDelFEM 1.1.12 (ここ から入手) 前から変わったところコンパイルに関しては、ソースコードおよびサンプルコードのインクルードファイルが直接の参照でなくなっている。 Visual Studio .NET 2003 Standard Edition によるコンパイルGLUT のセットアップここ から glut-3.7.6-bin.zip を入手する。ファイルを以下の場所に入れる。
DelFEM のコンパイル
つまづいた。 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 を入手。ファイルを以下の場所に入れる。
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 | |
| PENGUINITIS | |