[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:20569] Re: liboctaveを使ったルーチンのコンパイル



こじま@やっと一仕事片づいた,,です.

面白そうなんで,ちょっと追いかけてみました(笑)

From: Kenya SUZUKI <kenya00@trust.ocn.ne.jp>
Subject: [plamo:20567] liboctaveを使ったルーチンのコンパイル
Date: Sat, 13 Sep 2003 15:40:47 +0900

> % g++ test.cpp -I/usr/local/include -L/usr/local/lib/octave -loctave -lcruft \ 
> -lreadline -lkpashsea -lg2c -loctinterp
> 
> にてコンパイルしたところ
> 
> /usr/lib/gcc-lib/i386-pc-linux/2.95.3/libg2c.a(open.o): In function `f_open':
> open.o(.text+0x494): the use of `tempnam' is dangerous, better use `mkstemp'
> /usr/local/lib/octave/liboctinterp.so: undefined reference to `dlerror'
> /usr/lib/libreadline.so: undefined reference to `tgetnum'
> /usr/lib/libreadline.so: undefined reference to `tgoto'
> /usr/lib/libreadline.so: undefined reference to `tgetflag'
> /usr/lib/libreadline.so: undefined reference to `BC'
> /usr/local/lib/octave/liboctinterp.so: undefined reference to `dlclose'
> /usr/local/lib/octave/liboctave.so: undefined reference to `screenheight'
> /usr/lib/libreadline.so: undefined reference to `tputs'
> /usr/local/lib/octave/liboctinterp.so: undefined reference to `dlopen'
> /usr/lib/libreadline.so: undefined reference to `PC'
> /usr/local/lib/octave/liboctinterp.so: undefined reference to `dlsym'
> /usr/lib/libreadline.so: undefined reference to `tgetent'
> /usr/local/lib/octave/liboctave.so: undefined reference to `screenwidth'
> /usr/local/lib/octave/liboctave.so: undefined reference to 
> `kpse_clear_dir_cache'
> /usr/lib/libreadline.so: undefined reference to `UP'
> /usr/lib/libreadline.so: undefined reference to `tgetstr'
> collect2: ld returned 1 exit status
> 
> なるエラーが出てしまいます。
> OCtave自身のコンパイルは通っているので、test.cppのコンパイル時にリンクするライブラリに不足があるに違いないと踏んでいるのですが、
> 何が不足なのか良くわからんのです。

ざっと見,複数の要因が絡んでいるようです.

まずライブラリの不足ですが,

> /usr/local/lib/octave/liboctinterp.so: undefined reference to `dlerror'
> /usr/lib/libreadline.so: undefined reference to `tgetnum'
> /usr/lib/libreadline.so: undefined reference to `tgoto'

このあたりからして -ldl と -lncurses が必要です.

それから

> /usr/local/lib/octave/liboctave.so: undefined reference to `screenheight'
> /usr/local/lib/octave/liboctave.so: undefined reference to `screenwidth'

このあたり,純粋にそういう変数が存在しないと言っているから,test.cpp のどこかに

int screenwidth;
int screenheight;

みたいな宣言をすればいいみたい.

それから,

> /usr/local/lib/octave/liboctave.so: undefined reference to `kpse_clear_dir_cache'

これは正確には分からないんだけど,liboctave.so が想定している kpathsea 
ライブラリのバージョンが違うようで,Plamo-3.x の 
/usr/lib/libkpathsea.a にはこういうルーチンはないです.多分,最近の 
libkpathsea.a だとこの処理は不要になっているのだろうと判断して,

*** liboctave/pathsearch.cc~    2000-01-11 04:14:03.000000000 +0900
--- liboctave/pathsearch.cc     2003-09-13 18:22:11.000000000 +0900
***************
*** 162,168 ****
        octave_kpathsea_initialized = true;
      }
  
!   kpse_clear_dir_cache ();
  
    char *t1 = 0;
  
--- 162,168 ----
        octave_kpathsea_initialized = true;
      }
  
!   /*  kpse_clear_dir_cache (); */
  
    char *t1 = 0;
  
こんな感じでコメントアウトしちゃって,liboctave を再構築してやれば,と
りあえず問題のプログラムは動作する模様

kojima@celeron[~/Octave/octave-2.0.17]% g++ test.cpp -I/usr/include -L/usr/lib/octave -loctave -lcruft -lreadline -lkpathsea -lg2c -loctinterp -ldl -lncurses
/usr/lib/gcc-lib/i386-pc-linux/2.95.3/libg2c.a(open.o): In function `f_open':
open.o(.text+0x494): the use of `tempnam' is dangerous, better use `mkstemp'

kojima@celeron[~/Octave/octave-2.0.17]% ./a.out 
Hello Octave!
 1 1
 1 1

# もちろん,これが正しい動作かどうかは分っちゃいませんが,,(^^;

---------
こじま

Follow-Ups
[plamo:20571] Re: liboctaveを使ったルーチンのコンパイル, Kenya SUZUKI
References
[plamo:20567] liboctaveを使ったルーチンのコンパイル, Kenya SUZUKI

[検索ページ] [メール一覧]
Plamo ML 公開システム