アットウィキロゴ

MacOSX に ADVENTURE を入れてみよう!


ひょんなことで有限要素法に手を出すことになったが,それ用のいいパッケージを拾ってくることにする。まず4面体のメッシュを作るプログラムを持ってきて,コンパイルしてみる。これは

Tet_Mesh_P
Tet_Mesh_E
Tet_Mesh_S
Tet_Mesh_M
 

の4つからなり、このうちのPだけFortranで書いてある。
MacOSX 10.4 のgcc のバージョンは4.0.0 なので何とかなると思いきや,デフォルトでフォートランは入っていない。いろいろあさると,gcc用のFortran を配っているところがある。


の中。ダウンロードして,
sudo tar -xvf gcc-bin.tar -C /
 
を実行してFortran は無事にインストールする。次に本体のコンパイルに入る。Makefile のコンパイラ指定の部分を
F90	= gfortran
FFLAGS	= -O
LDFLAGS	=-static
LIBS	=
SRCX	= util.f
 
と書き換えると,

/usr/bin/ld: can't locate file for: -lcrt0.o

というエラーが出て止まる。これも検索したら,

Anyway, DarkSaint might try the following workaround: look for any "-static" declarations in the "Makefile" you've been given. Just obliterate the "-static" every time you find it in that file and then see if the package will "make" successfully.

となっていたので、-staticを外す。するとさらに

/usr/bin/ld: Undefined symbols:
_fdate_
 


というエラーで止まった。


これは前回おなじみ,Fortranで何かのライブラリが見つけられない,ということだろう。いろいろ探すと,


という掲示板で

やっとCygwinにgcc4をいれてみました。
それで、gfortranでTetMesh_Pをビルドしてみましたが、
なんとか動いてくれているようです。
 
fdateはないと言われるので、適当な日付の文字列で代替してみた。
sttchk関数で実行時にエラーがでるので、allocateやdeallocateで使うistをintegerで宣
言してみた。
書式付きwriteで"$"が入ってると実行時に怒られるので、とりあえず削除してみた。
#この"$"はどういった意味なのでしょう?私はfortranはすでに記憶の彼方に・・・
 
といった修正で動いてくれました。
 

ということなので、ソースをいじらないといかんらしい。fdate_ を呼んでいるファイルを見るとutil_AIX.f とutil_HP.f で、util.fでは呼んでいない。(ということは、こいつでは,fdate()がシステムで定義されてることになっているらしい。fdate関数をutil.f に入れて再コンパイルしてみる。

cfdate              *****  function    fdate   *****
c
c     dummy fdate
c
      function fdate ()
c
      character  fdate*24
c
c ***
c
c fdate = "asd"
 
c
      return
      end
 
 
をいれたら、まあWarning は出たがコンパイラは通った。


次はTetMesh_E.

amk_mesh_ev.h:17:19: error: malloc.h: No such file or directory
 

というエラーが出たので検索をかけたら,

Problem
In FreeBSD 2.0.5, malloc.h is obsolete; stdlib.h should be used instead.
Solution:
 
#include <stdlib.h>
#if defined(HAVE_MALLOC_H)
#include <malloc.h>
#endif
 

と出てきたので,対応するソースを変更するとそちらは通った。次に

/usr/bin/ld: can't locate file for: -lcrt0.o


というエラーが出たが,こちらは

iMac G5 で以上の要領でソフトのインストールをしようとしていたら、
"/usr/bin/ld: can't locate file: -lcrt1.o" というエラーで configure が止まってしまったりというエラーに直面しました。実際、hello-world.c でさえコンパイルできなくなっていました。
この問題は、新品の Mac に、Panther についてきた XCode の CD-ROM でインストールをすると、一部のファイルがコピーされないという問題らしいです。新品の Mac についてきた、Developer Tools の CD を使うようにすればこれは回避できます。
もしうっかり、この状態になったときには、もしもう一台 Mac があって、それがきちんとコンパイルできているなら、/usr/lib 以下の bundle1.o、crt1.o、dylib1.o、gcrt1.o の4つのファイルをコピーしてくれば大丈夫。
もしもう一台 Mac が手近にないのでしたら、Apple の Developer Site から XCode 1.1 の complete CD をダウンロードして、インストールするといいそうです。
 

ということなので、/user/lib/ をチェックしたらちゃんと入っている。

コンパイラのオプションの LDFLAGS = -static となっていたところをLDFLAGS= のみにしたらこちらもコンパイラが通った。このstatic とは何か?

ライブラリ(さまざまなアプリケーションが共通で使うプログラムの部品の集まり)とプログラム本体との関係を表わす言葉。プログラムを開発するときのリンクの際、プログラムとライブラリ関数をひとつのファイルにまとめることを静的リンクという。それに対し、リンク時にライブラリと結合するのではなく、プログラムが必要に応じてライブラリを呼び出す方法。Windowsで採用されているDLL(ダイナミック・リンク・ライブラリ)は動的リンクにより呼び出される。静的リンクに比べ、ライブラリやプログラム本体の修正が容易になる。【反】静的リンク
 
だそうな。他のプログラムもBuild して、走らせてみると、うまくいった。

しかし,日付がでないのは腹が立つので,なんとか入れてみようとgfortran のマニュアルをあさる。DATE_AND_TIMEというルーチンを使ったプログラムがあったので,testフォルダを作ってファイルを入れて,gfortranをかけてみたが大量にエラーが出るだけで何も起こらない。なんだよ。

と思っていたが,入門ページを見ていたら,
•	FORTRAN のプログラムを構成する文は、1行の7文字目から72文字目までに収め る。上の例で、多くの行で、最初の6文字分下がっているのは、このためである。
	•	1行に収まりきらない時は、次の行の6文字目に & などの文字を入れる事で、継続行を意味させる事にして、2行にわたらせる。 もっと長い時も、同様。
	•	1文字目に c 或いは * の文字のある行はコメント行とする。
	•	! の後ろもコメントと見做す。
	•	1文字目から5文字目まで数字列は行番号を表す。
	•	大文字と小文字の区別はしない。
	•	プログラムはProgram文で、名前を宣言し、Stop文と End文で終わる。
 
という説明があってびっくりする。なんちゅう古風な。テスト用のプログラムの前の方に空白を6文字入れたら普通に動いた。

後は文字列の扱い。マニュアルを見る限り

短いとき: 左詰めで代入され,残りには空白文字が代入される。
長いとき: 左詰めで代入され,余った分は切り捨てられる。
 

ということなので、いろいろいじっていたらうまくいった。結局は

cfdate              *****  function    fdate   *****
c
c     dummy fdate
c
      function fdate ()
c
      character  fdate*24
      character(8) :: date
      character(10) :: time
 
! using keyword arguments
      call date_and_time(DATE=date)
	  call date_and_time(TIME=time)
 
c
c ***
c
      fdate= date(1:4)//"/"//date(5:6) //"/"//date(7:8)//" "// 
     &time(1:2)// ":"// time(3:4) // ":" // time(5:6)
 
c
      return
      end
 

次は可視化ツールを入れてみる。その前にAdvIO を入れないといかんらしい。とりあえずReadme をみて ./configure をかけてみたら、

checking host system type... configure: error: can not guess host type; you must specify one
 

となった。よくわからんけど、./configure --help を見て,

/.configure --host=HOST
 

としたらちょっと進んだ。今度は

ar cru libAdvIDL.a  
ar: no archive members specified
 
として止まる。arとは何かと思ったら

ar
アーカイブをいじるソフト。 たいていはたくさんの .o ファイルを .a ファイルに まとめるために使うと思う。
ar cru libhoge.a *.o
などと。その後は後述の ranlib を使う。
 

ということだった。libAdbIDL.aにまとめる方のファイルが指定されていないので,makefile をチェックしてみると

$(AR) cru libAdvIDL.a $(libAdvIDL_a_OBJECTS) $(libAdvIDL_a_LIBADD)
 
というところ。つまり libAdvIDL_a_OBJECTSや libAdvIDL_a_LIBADDが指定されているところを探せばよい。見てみると,
libAdvIDL_a_OBJECTS =
となっているところは何カ所かあるが,すべて#でコメントアウトされている。だいたいIDLって何だ?ということで検索をかけると

IDL 
読み方 :
アイディーエル
フルスペル :
Interface Definition Language
 ソフトウェア開発において、オブジェクトと呼ばれるプログラム部品を、他のプログラムから利用するためのインターフェース(外部仕様)を記述するのに使われる言語。そのオブジェクトが備えるメソッド(命令)やプロパティ(属性)などの情報を定義するのに使う。
 

となっている。道理でIDLフォルダの中にヘッダしか見当たらなかった訳だ。その他もいろいろあさっていると

ORBitのC++用IDLコンパイラorbitcppを試してるんですが、 いまだうまく生成できず。
 

という記事を発見。これか?とりあえずorbitcppを落としてきてインストール。まず./configure したら、

*** The pkg-config script could not be found. Make sure it is
*** in your path, or set the PKG_CONFIG environment variable
*** to the full path to pkg-config.
*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config.
 
というエラーメッセージが出る。このpkg-config も拾ってきて,入れてみたが今度はORBit-2.0.pc がない,ということでなんだかめんどくさい。よくみたらfinkにOrbit2.0が入っている!

fink でインストールしたのち、再度/.configure してみる。しかし、Orbit:noと出てくるので,認識されていないように見える。


ついにめんどうになって、IDL/Makefile を開いて,248−249行目の

#	$(AR) cru libAdvIDL.a $(libAdvIDL_a_OBJECTS) $(libAdvIDL_a_LIBADD)
#	$(RANLIB) libAdvIDL.a
 

をコメントアウトしてしまったら,なんか動いたらしい。


Mesa というグラフィックスライブラリもインストールした。こちらはmake darwin で一発。
さらに Mpich という並列処理用のライブラリも入れる。こちらも./configure, make, make install で一発。

次はTriPatch. こちらはコンパイルはスムーズに進んだが,最後にmake install をするときになって

"`install' is up to date."
となって進まない。何かと思って検索をかけたら

360 名前:名無し~3.EXE :03/10/04 20:40 ID:hhU5VvIf
>>358-359 
installというファイルは無いけどINSTALLというファイルがあるので 
大文字小文字の区別をしないWin環境では誤動作する。 
適当にリネームしてやれば動く
 
となっていたので、INSTALLというファイルをINSTALL.en としてみたら動いた。動作も確認。


さらに、AdvBCTool.

2. 次の8つのマクロを環境に合わせて設定します。
       デフォルトではRedHat Linux 7.3用の設定になっています。
 
       CXX       <--- C++コンパイラ
       CXXFLAGS  <--- コンパイルオプション
       GL_INC    <--- OpenGL(またはMesa)のインクルードファイルの指定
       GL_LIB    <--- OpenGL(またはMesa)のライブラリの指定
       X11_INC   <--- X11のインクルードファイルの指定
       X11_LIB   <--- X11のライブラリの指定
       MOTIF_INC <--- Motif(またはLessTif)のインクルードファイルの指定
       MOTIF_LIB <--- Motif(またはLessTif)のライブラリの指定
 
    3. 次の2つのマクロを環境に合わせて設定します。
       デフォルトではRedHat Linux 7.3用の設定になっています。
 
       GLWFLAGS  <--- bcGUI用のオプション
       GLW       <--- GLwウィジェットのライブラリの指定
 
       RedHat Linux 7.2の場合
          GLWFLAGS  = -DGLW_HDR_ANOTHER_LOCATION -DnoMotifGLwidget
          GLW       = -lMesaGLw
 
       RedHat Linux 7.3の場合
          GLWFLAGS  = -DGLW_HDR_ANOTHER_LOCATION -DnoMotifGLwidget
          GLW       = -lGLw
 
       UNIXの場合
          GLWFLAGS  =
          GLW       = -lGLw
 

はじめは”XmAll.h”がみつからない、とのことだったので、fink で openmotif3 を入れて,OpenGLのディレクトリを

CXX       = g++
CXXFLAGS  = -O3
GL_INC    = -I/sw/src/xfree86-4.3.99.16-2/xc/include/
GL_LIB    = -L/sw/lib
X11_INC   = -I/usr/X11R6/include
X11_LIB   = -L/usr/X11R6/lib:/usr/lib
MOTIF_INC = -I/sw/include
MOTIF_LIB = -L/sw/lib
GLWFLAGS  =
GLW       = -lGLw
 
に変える。しかし,まだ何かのライブラリを認識していないようなエラーが出る。

copenglapp.cxx: In function 'void clear(std::map<Key, Value, std::less<_Key>, std::allocator<std::pair<const _Key, _Tp> > >&)':
copenglapp.cxx:44: error: expected `;' before 'it'
copenglapp.cxx:45: error: 'it' was not declared in this scope
copenglapp.cxx: In member function 'bool COpenGLApp::ReadPCH(CString)':
copenglapp.cxx:84: error: 'ios' has not been declared
copenglapp.cxx:84: error: 'in' was not declared in this scope
copenglapp.cxx:84: error: 'ios' has not been declared
copenglapp.cxx:84: error: 'nocreate' was not declared in this scope
copenglapp.cxx:86: error: 'cerr' was not declared in this scope
copenglapp.cxx:86: error: 'endl' was not declared in this scope

と行った感じ。よく見ると,これらは <fsteram.h>で定義しているもの。fstreamに変えてみる。

ios::nocreate に関するエラーも出たのでチェック。

there is no ios::nocreate/ios::noreplace in ISO 14882
I have seen ios::nocreate being used for input-streams, most probably because the author thought it would be more correct to specify nocreate "explicitly". So you can simply leave it out for input-streams.
For output streams, "nocreate" is probably the default, unless you specify std::ios::trunc ? To be safe, you can open the file for reading, check if it has been opened, and then decide whether you want to create/replace or not. To my knowledge, even older implementations support app, ate and trunc (except for app ?).
 
見た感じはinput stream のようだったので,単に外す。

copenglapp.cxx:86: error: `cerr' undeclared (first use this function)
というエラーに関しては

<fstream> does not define std::cout, std::cin etc.
In earlier versions of the standard, <fstream.h>, <ostream.h> and <istream.h> used to define cout, cin and so on. Because of the templatized iostreams in libstdc++-v3, you need to include <iostream> explicitly to define these.
 
ということで、#include <iostream> を入れてみると,かなり進んだ。

さらに、main.cxxで

main.cxx:24:31: X11/GLw/GLwMDrawA.h: No such file or directory
 

と出たので,オプションをチェックして,Makefileの

GLWFLAGS = -DGLW_HDR_ANOTHER_LOCATION -DnoMotifGLwidget
の「 -DGLW_HDR_ANOTHER_LOCATION」を外す。

これでだいたい通るが,最後に

ld: Undefined symbols:
_glXIsDirect
_glXMakeCurrent
_glXSwapBuffers
_glXUseXFont
_glXChooseVisual
_glXCreateContext
 


と出る。すべてglx.hに入っているが,該当するライブラリがないようだ。 libGLwが入っているディレクトリをGLのディレクトリに指定する。

次に,cio.ccの中のnocreateを消したり,<iostream> をinclude したりする。ついでに、gccのバージョンが違うことに気がついたので4.0にあげたら

cio.cxx:67: error: dependent-name 'std::map<Key,Value,std::less<_Key>,std::allocator<std::pair<const _Key, _Tp> > >::iterator' is parsed as a non-type, but instantiation yields a type
cio.cxx:67: note: say 'typename std::map<Key,Value,std::less<_Key>,std::allocator<std::pair<const _Key, _Tp> > >::iterator' if a type is meant
 

というエラーが出てくる。

/* GCC 4.0 is much stricter about requiring use of the 'typename'
   keyword.  Previous versions would sometimes assume that an unknown
   name was a type; GCC 4.0 does not.  */
 


という記述も見つけたので,行の前にtypename というキーワードを入れる。

この辺りを地道に直していたら,コンパイラは通ったらしい。


最後に

MiuraiBookG4:/Users/miura/ADVENTURE/src/AdvBCtool-1.02 root# make install
make: `install' is up to date.
というのが出たので,INSTALLというファイル名を_INSTALLにリネームしてやる。Makefile内にINSTALLファイルを転送する命令があるので,そいつも_INSTALLにする。これで動いた。

次はAdvMetis. 普通に./configure --host=HOST, make でコンパイラを通った。

次はAdvSolid. 普通に./configure --host=HOST, make でコンパイラを通った。

最後にAdvVisual. serverに移動して,
./configure --with-advio=/Users/miura/ADVENTURE/src/AdvIO-1.1
 
としてからmakeをかけると、

../client/Common/pthread.h:24: error: 'pthread_t' does not name a type
 

というエラーが出る。これがちょっと臭い。というのは、../client/Common の下にはpthread.h というファイルはない。PThread.h という大文字のファイルがあるのみである。どうやらこのコンパイラは大文字小文字の区別をしていないのではないか?小文字のpthread.h というファイルは
/usr/include/pthread.h

にある。こちらを間違って読んでいるのではないか?しょうがないのでmiを使って
Pthread.h
となっているところをすべて
PPThread.h
に変えて、../client/Common の下のファイルをPPThread.h に変えてみる。エラーが消えた!
次が

string++.h:58: error: ISO C++ forbids declaration of 'istdiostream' with no type
 

というエラーが出る。これに関しては

gcc3.xでの<strstream>代替ヘッダーは<sstream>で、(場合によっては
<iterator><iostream>も?)そのうえで、ソースの中のstrstream命令
文?をstringstreamとすればなんとかクリア出来たように思いますが、
<strstream.h>の代替としては未確認です。
<stdiostream.h>の代替についても色々調べてみてはいるのですが、
今のところ未解決です。(^^;
 
gcc2.9xでは<stdiostream.h>がありますので、AdvVisualのビルドは多分
こちらで行われたのだと思いますです。
自分もgcc2.9xでしか成功していませんです。
 


という書き込みがあったので,自分で探さんといかん。stdiostream の機能についての説明を探すと

クラス stdiobuf は、文字の入力元または出力先である実際のファ
     イ ルへの中間的なオブジェクトとして C の標準入出力ファイル (
     FILE ) を使用するように、 streambuf を特殊化したもの で す。
     streambuf  の 基 本 操 作については、 sbuf.prot(3C++) および
     sbuf.pub(3C++) の説明を参照してください。入出力操作とシー ク
     操作は、対応する FILE に対する変更に反映されます。シーク関数
     は、たとえば fseek() として実装されます。
 
     stdiostream は、C の標準入出力ファイルと C++ との間のイン タ
     フェー ス を提供します。このクラスは、 stdiobuf をバッファに
     持っています。これは、入出力ストリーム全体を実装したものでは
     な く、バッファクラスとクラス ios の機能しか持っていません。
     C++ の入出力は、C の標準入出力関数の getc() と putc() を文字
     単 位で呼び出すことによって行われます。C と C++ が同期してア
     クセスすることはできないため、通常のバッファリングは行われま
     せん。
 
     これらのクラスのどちらかを使用するのは、C の標準入出力ライブ
     ラリを用いたコードと、C++ の入出力ストリームを用いたコードを
     同じファイル上で使用することを可能にするためです。新しいコー
     ドには、より効率的な filebuf と fstream を使用するようにして
     ください。
 

とりあえず古いシステムの遺産なので,なんとかせんと,と思っていたが,とりあえずは古ーいgccのソースを引っ張ってきて,stdiostream.hとstdiostream.ccを加えてみるが、うまくいかん。fink,で古いgccを入れようとしたら

| Note also that older compilers for 10.4 can be obtained by installing
| the "XCode Legacy Compilers" package available at the same address.
| 
| Web site: http://fink.sourceforge.net/faq/comp-general.php#gcc2
 

というのが出てきたので,XCode Legacy tools を入れてみる。パッケージを入れてやって,suになってからgcc_version 2 で変える。

MasterServer.cpp:275: `ADVVISUAL_VER_STRING' undeclared (first use this function)
というのが出てきたので,探してみるとversion.hというヘッダがservers/とclient/の2カ所にあって,serversの方には定義が入っていない。中に

#define ADVVISUAL_VER_STRING "1.0"
 

を入れてやったからかなり進んだ。
/bin/sh: line 1: /Users/miura/ADVENTURE/advsys-config: No such file or directory
 
というのが出てくるので,Makefileの
LIBS = `$(ADVIO_DIR)/advsys-config --libs docio`

LIBS = `$(ADVIO_DIR)/bin/advsys-config --libs docio`

に変えてやる。つぎは
/usr/bin/ld: multiple definitions of symbol _version
advvis_server.o definition of _version in section (__DATA,__data)
MasterServer.o definition of _version in section (__DATA,__data)
 
のエラー。version.hが2カ所にあったからまあ当然か。しかし,どうやって直すか?version.h の中の_version をコメントアウトしてみる。そうすると

advvis_server.cpp: In function `int main(int, char **)':
advvis_server.cpp:87: `version' undeclared (first use this function)
advvis_server.cpp:87: (Each undeclared identifier is reported only once
advvis_server.cpp:87: for each function it appears in.)
make: *** [advvis_server.o] Error 1
 

ということで、versionが定義されてない,ということらしい。よく見ると,ソースコードの中にversion.hとVersion.hの2つがある。大文字小文字を認識しないためのエラーらしい。大文字の方をVVersion.hとリネームしてやる。こんどは

/usr/bin/ld: Undefined symbols:
___vt_12istdiostream.3ios
___vt_12ostdiostream.3ios
_sprintf$LDBLStub
_fprintf$LDBLStub
_printf$LDBLStub
 

というのが出てきた。どうやら、stdiostream.hというヘッダをどこかから取ってきて入れてあるので,今のgccのライブラリ側では認識してくれないのではないだろうか?
MeshManがKUINS-IIIの中では走らないので,困ったなと思っていたが,どうやらこれはsocks-proxyをオンにしていたかららしい。何をするためのものなのかいまいち把握していないが...

タグ:

+ タグ編集
  • タグ:
最終更新:2008年05月06日 11:32