コンパイルでは問題なかった.ダウンロードしてきた tar.gz ファイルを展開.Makefile の CFLAGS に -m64 を設定して make && make install64 すれば SLLIB も SFITSIO もインストールはできた.
問題が起こったのは実際に自分のプログラムで使おうとしたとき.コンパイルしようとすると.
'isfinite' was not declared in this scope
という感じのエラーが出た.
なお,使用しているコンパイラは g++ でバージョンは以下のとおり.
$ g++ --version g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
エラーが出たあたりのソースを見ると isfinite は std:: などなしにそのまま記述してある.インクルード元だと思われるヘッダファイル math.h を見てみる.isfinite は #define マクロとして定義されている.
/* Return nonzero value if X is not +-Inf or NaN. */ # ifdef __NO_LONG_DOUBLE_MATH # define isfinite(x) \ (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x)) # else # define isfinite(x) \ (sizeof (x) == sizeof (float) \ ? __finitef (x) \ : sizeof (x) == sizeof (double) \ ? __finite (x) : __finitel (x)) # endif
自分のプログラムを見ると cmath をインクルードしていた.このヘッダファイルをみてみると
// These are possible macros imported from C99-land. #undef fpclassify #undef isfinite #undef isinf #undef isnan #undef isnormal #undef signbit #undef isgreater #undef isgreaterequal #undef isless #undef islessequal #undef islessgreater #undef isunordered
ということで #undef していた.そのせいでエラーが発生していたようである.
cmath を使わずに math.h だけ使用する……というのがひとつの解決策.ただし,cmath を使用する機会はあるのではないかという気がしたので SLLIB, SFITSIO をちょっと書き換える.
具体的には grep コマンドで isfinite を使用しているソース,ヘッダファイルを同定して s/isfinite/std::isfinite/で置換した.また, math.h をインクルードしているヘッダファイルでは並行して cmath もインクルードするようにした.
この方法で自分の作成していたプログラムはとりあえず動作するようになった.しかし,cmath では他にもいろいろなマクロを #undef している.同種の問題は他の場所でも起こりうるかもしれないので,今回の対応を忘れないようにしたい.
論文管理ソフトウェアとして http://www.zotero.org/:Zotero を使用している.NASA/ADS のデータベースから取得したした文献データを BibTeX 用のファイルにエクスポート.この bib ファイルと NASA/ADS からダウンロードしてきた apj.bst ファイルを使用してコンパイルしたら BibTeX が以下のようなエラーを吐いた.
You can't pop an empty literal stack for entry SOME_BIBLIOGRAPHY_20XX while executing---line 1676 of file apj.bst
apj.bst ファイルの 1676 行目はイテレーションを回しているだけのようなので関係ないらしい.
以上の推測から apj.bst のなかで @article を処理している部分に注目.一行ずつコメントアウトしてどこが問題なのかを切り分けた.最終的にあるブロックを以下のようにコメントアウトすることでエラーを消すことができた.
--- apj.bst.orig 2013-02-14 20:02:51.266775055 +0900 +++ apj.bst 2013-02-14 19:26:28.069025488 +0900 @@ -1090,10 +1090,10 @@ format.pages output } if$ - pages empty$ - { format.eprint output } - { format.journal.pages output } - if$ +% pages empty$ +% { format.eprint output } +% { format.journal.pages output } +% if$ format.journal.pages format.note output fin.entry
どうやら format.journal.pages の周辺でエラーが発生しているらしい.コメントアウトした format.journal.pages 直後の output を消してもエラーは出なかった.この関数の仕様をちゃんと読めばもう少し問題の切り分けができるかもしれない.
あくまで推測に過ぎないが, Zotero に保存した文献データの pages に開始ページしか含まれていないことが問題なのではないかという気もしている. apj.bst はもともと NASA/ADS が出力する bib ファイルに特化しているはずである. NASA/ADS からダウンロードした bib ファイルの書式と Zotero が出力した bib ファイルの書式を見比べることで更に問題が切り分けられるかもしれない.面倒なので検証はしていない.
JAXA 宇宙科学研究所の山内さんが開発している SLLIB, SFITSIO の新しいバージョンがリリースされたらしい.
今回のは SIMD を使った高速化と,IDL 風の要素指定ができる API が目玉です. /* 切り出してコピー */ array1 = array0.sectionf("0:99, *"); /* 左右反転 */ array.flipf("-*,*"); /* 高速トランスポーズ(xとyとの入れ替え) */ array.transpose_xy(); のような事ができるようになりました.
特に「領域を切り出してコピー」は使いやすそう.画像を読み込む際に IRAF 的な記述も可能になっているらしい.従来のものに比べて高速化も実現しているという話なので実際に使ってみるのが楽しみ.
研究で使うソフトウェアのインストール.
最新版の ds9, xpa はここからダウンロードできる.バイナリで配布されているのでコンパイルする必要なくインストールできる. ds9 のバージョンは 7.1, xpa のバージョンは 2.1.14 を使用する.
sudo apt-get install libxss1 cd /usr/local/src/ mkdir ds9-7.1; cd ds9-7.1 tar zxvf ~/Downloads/ds9.linux64.7.1.tar.gz ln -s /usr/local/src/ds9-7.1/ds9 /usr/local/bin/. cd /usr/local/src/ mkdir xpa-2.1.14; cd xpa-2.1.14 tar zxvf ~/Downloads/xpa.linux64.2.1.14.tar.gz ln -s /usr/local/src/xpa-2.1.14/* /usr/local/bin/.
iraf, x11iraf ともに最新版をここからダウンロード. iraf は Linux 64bit 版 をダウンロード. x11iraf は 24 bit 版をダウンロード.バージョンはそれぞれ iraf-2.16, x11iraf-2.0beta となる.
iraf はすでにコンパイルしてあるので環境変数 iraf をセットしてインストールスクリプトを走らせるだけで完了する.あとは必要に応じてパッケージを make する.
sudo apt-get install tcsh
cd /usr/local/share
mkdir -p iraf/iraf; cd iraf/iraf
tar zxf ~/Downloads/iraf.lnux.x86_64.tar.gz
export iraf=/usr/local/share/iraf/iraf
${iraf}/unix/hlib/install
cd ${iraf}/extern
sudo ./configure
sudo make stsdas
残念ながら x11iraf はコンパイルしてあるものをダウンロードしてきたのだけどなぜか起動しなかった.似たような問題は以前にもあった.
./xgterm: error while loading shared libraries: libXmu.so.6: wrong ELF class: ELFCLASS64最初は libXmu.so.6 がないと言ってきたので LD_LIBRARY_PATH で指定してあげたら今度はこういったエラーになった. google 先生に聞いたところによるとこれは 32bit を期待してライブラリを見に行ったら 64bit じゃないかどうしてくれるんだチクショウ!ということらしいので 32bit のライブラリをインストールすることにした.
Xubuntu 10.04 64bit で xgterm が起動しなかった問題 - どせいけいさんき。
ただし今回発生したエラーは
bash: /usr/local/bin/xgterm: No such file or directory
……これは 32bit 版ライブラリをインストールしても解決しないのではないかと思ったので,ソースからコンパイルすることに.基本的には configure (xmkmf) して make すれば良いのだけどそのままではコンパイルが通らない.
sudo apt-get install xutils-dev bison flex sudo apt-get install libxmu-dev libxaw7-dev cd /usr/local/src mkdir x11iraf; cd x11iraf tar zxvf ~/Downloads/x11iraf-v2.0BETA-src.tar.gz xmkmf ## (ここでソースをちょっといじる) make World sudo ./install
まず訂正した部分は obm/ObmW/Imakefile の 24 行目で
20 #if defined (PpcDarwinArchitecture) || defined (TenonServer) 21 CCOPTIONS = -traditional-cpp 22 #endif 23 -24 #if ((GccMajorVersion == 3) && (GccMinorVersion >= 1)) +24 #if ((GccMajorVersion >= 3) && (GccMinorVersion >= 1)) 25 CCOPTIONS = -DUSE_STDARG 26 #else 27 CCOPTIONS = 28 #endif
もうひとつ訂正した部分は xgterm/button.c の 43 行目で
39 #include "data.h" 40 #include "error.h" 41 #include "menu.h" 42 -43 extern char *malloc(); +43 extern void *malloc(); 44
以上を直せばちゃんとコンパイルが通るようになる.なお,実際に使ってみてエラーが出るかどうかはまだ確認していない.
開発者である山内さんのページから引用.
JAXA・宇宙科学研究所の「あかり」プロジェクトで生まれた,
C言語における日常的プログラミングを真に効率化するライブラリ
混沌とした「C言語 + C++環境」, APIの呼出し手順大杉な「CFITSIO」にうんざりしている方にお勧めします.
SLI ライブラリ for C users
なんだか面白そうなのでインストールしてみることにした.普段は Octave (MATLAB) や IDL で計算をしているのだけど,このライブラリを使えばほぼ同じようにして計算が実装できるような気がする.日本語のドキュメントが付いているのも初心者には嬉しい.
プロジェクトページに書いてある通りだった.
末尾の 64 はインストールしたマシンが 64bit だったからであって 32bit マシンにインストールするときには 32 に変更する.ドキュメントには簡単なチュートリアルが付属しているのでとりあえず動かしてみたのが冒頭の画像.実際にはうねうねアニメーションしている. SFITSIO のテストはまだ.
ProMS 2.0 の ログインページ > FAQ に記載してあるリンクからダウンロードページに飛べる.
*1:ただし最新版を使ったからといってテンプレートに記載した内容が全て反映されるわけではないことに注意…….
./xgterm: error while loading shared libraries: libXmu.so.6: wrong ELF class: ELFCLASS64
最初は libXmu.so.6 がないと言ってきたので LD_LIBRARY_PATH で指定してあげたら今度はこういったエラーになった. google 先生に聞いたところによるとこれは 32bit を期待してライブラリを見に行ったら 64bit じゃないかどうしてくれるんだチクショウ!ということらしいので 32bit のライブラリをインストールすることにした.
どうやら ia32-libs をインストールすればよいらしいのだけど,
The following extra packages will be installed: bluez-alsa:i386 gtk2-engines:i386 gtk2-engines-murrine:i386 ... 中略 ... libxmu6:i386 libxp6:i386 libxslt1.1:i386 libxss1:i386 odbcinst odbcinst1debian2 odbcinst1debian2:i386 xaw3dg:i386
といった感じで 60 個超のあらたなパッケージをインストールすることになりそうだったので今回は必要なパッケージだけをインストールすることに.必要なライブラリの後ろに :i386 をつければ 32bit 版のライブラリがインストールできるような気がする.
[ohsawa@hamatta bin.linux ]$ sudo apt-get install libxmu6:i386 Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: libxmu6:i386 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 52.4 kB of archives. After this operation, 144 kB of additional disk space will be used. Get:1 http://jp.archive.ubuntu.com/ubuntu/ precise/main libxmu6 i386 2:1.1.0-3 [52.4 kB] Fetched 52.4 kB in 0s (137 kB/s) Selecting previously unselected package libxmu6:i386. (Reading database ... 274330 files and directories currently installed.) Unpacking libxmu6:i386 (from .../libxmu6_2%3a1.1.0-3_i386.deb) ... Setting up libxmu6:i386 (2:1.1.0-3) ... Processing triggers for libc-bin ... ldconfig deferred processing now taking place
というわけでできた. xgterm も問題なく起動した.