68user's page 掲示板

Prev< No. 1929〜1934> Next  [最新発言に戻る] [過去ログ一覧]
No. 1929 # 68user 2001/05/04 (金) 10:15:59
>>1447 nac
! で fold しているのは sendmail くんだそうで。
    http://script.lovely.to/bbs/infolng.cgi?print+200104/01040037.txt

No. 1930 # XRD [E-mail] 2001/05/07 (月) 13:33:13
はじめまして。XRDといいます。
ただいま、C言語でCGIを作成しようと勉強中の身です。
そこでインプレスより販売しているCGIブックを購入したのですが、
コンパイルがうまくいきませんでした。
ソース内容は以下の通りです。
http://home.impress.co.jp/books/ietech/cgi.code/7.2.html

動作環境:TurboLinux6

tmp/ccuVjNj9.o: In function `main':
/tmp/ccuVjNj9.o(.text+0x10b): undefined reference to `splitword'
/tmp/ccuVjNj9.o(.text+0x122): undefined reference to `unescape_url'
/tmp/ccuVjNj9.o(.text+0x14a): undefined reference to `splitword'
/tmp/ccuVjNj9.o: In function `GetUserID':
/tmp/ccuVjNj9.o(.text+0x76c): undefined reference to `dbm_open'
/tmp/ccuVjNj9.o(.text+0x7bf): undefined reference to `dbm_fetch'
/tmp/ccuVjNj9.o(.text+0x886): undefined reference to `dbm_store'
/tmp/ccuVjNj9.o(.text+0x894): undefined reference to `dbm_close'
/tmp/ccuVjNj9.o: In function `GetOrderRecord':
/tmp/ccuVjNj9.o(.text+0x8c3): undefined reference to `dbm_open'
/tmp/ccuVjNj9.o(.text+0x915): undefined reference to `dbm_fetch'
/tmp/ccuVjNj9.o: In function `UpdateOrderRecord':
/tmp/ccuVjNj9.o(.text+0x9ba): undefined reference to `dbm_store'
/tmp/ccuVjNj9.o: In function `CloseDatabase':
/tmp/ccuVjNj9.o(.text+0x9ce): undefined reference to `dbm_close'
collect2: ld returned 1 exit status

自分なりの解釈としては、コンパイラのせいではなく、リンクの失敗ではないかと思っています。そこで、ndbm.hというファイルで宣言する際に必要なライブラリを指定すれば正常にコンパイルができるものだと思ったのですが、方法もしくはファイルがどこにあるかがわかりません。
manで調べたり、ndbm.hのファイルを開いて調べてみたのですが、それに関する情報がありませんでした。解釈がまちがっているのかもしれません。なにとぞ、ご指導おねがいします。

No. 1931 # 68user 2001/05/07 (月) 16:32:42
>>1930 XRD
> 自分なりの解釈としては、コンパイラのせいではなく、リンクの
> 失敗ではないかと思っています。
その通りです。

コンパイル済の dbm_open の実体 (=オブジェクト) が、標準 C
ライブラリの libc.so.* に含まれていないのでリンク時にエラーに
なっているわけです。なので、dbm 関係のライブラリ名を指定しないと
いけません。探し方はこちら。
    http://www.jp.FreeBSD.org/QandA/HTML/1609.html

というわけで、手元の LASER5 Linux で
    % nm -o /lib/*.so.* /usr/lib/*.so.* | grep ' T ' | grep dbm_open
試すと、
    /lib/libdb1.so.2:00009d70 T dbm_open
    /lib/libdb.so.2:00009d70 T dbm_open
    /usr/lib/libgdbm.so.2:00002230 T dbm_open
    /usr/lib/libgdbm.so.2.0.0:00002230 T dbm_open
となりますので、cc -ldb -L/lib とか、cc -lgdbm -L/usr/lib すれば
よいことがわかります。libdb の方は ndbm で、libgdbm の方は gdbm
でしょうが、どちらがよいかはわかりません。

で、splitword と unescape_url の方は
    http://home.impress.co.jp/books/ietech/CGI.contents.html

    ソースコードのリスト → cgiutils.h, cgiutils.c
のところにあります。これをリンクするよう記述があったのでしょうが
見落としておられるのではないでしょうか。

No. 1932 # mm 2001/05/08 (火) 12:43:24
>>1927 ミングさん
>で全てを出す方法で目的は達成したのですが,それを一度で出したいと思い、下の様にしてみました。
実用的には、まずパイプで繋ぐことを検討すべきです。
1つのスクリプトにするにしても、元の2つがデータの行ごとの処理なので、
close や getline を使う必要がよく分かりません。

awkの勉強ということであれば、もっと単純な課題を使うべきでしょう。
スクリプトを拝見する限り、awkの文法を十分に理解されてるとは思えないもんで…

No. 1933 # _ 2001/05/08 (火) 15:56:47
>>1927 ミング
私の勘違いでなければ

#!/usr/bin/awk -f
{
        for (i = 0; i < 4; ++i)
                for (j = 0; j < 4; ++j)
                        print($1 "-" i + 1, j + 1, $2 + 100 * j, $3 + 100 * i)
}

で済む話だと思うんですが...
今の問題は、制御の流れを追って考えれば分かるのでは。

(1) 暗黙にstdinから1行入力
(2) 最初のアクションで、out1に4行出力
(3) 2番目のアクションで、out1から1行入力
        stdoutに4行出力後、(1)へ

(3)のgetlineで1行しか読んでいないので、(1)で
EOFが来る頃には、まだout1の1/4しか処理していない訳です。

No. 1934 # XRD [E-mail] 2001/05/09 (水) 12:12:14
68userさん、ありがとうございました。

まだ、うまくはできていませんが、がんばってみます。
splitword、cgiutils.cは見落としてました。
幸い本に掲載されていましたので、解決できそうです。
まだ、未熟者なので、わからないことが多々あると思います。
そのときは、お手数ですがよろしくお願いいたします。

Prev< No. 1929〜1934> Next  [最新発言に戻る] [過去ログ一覧]