6. make でエラーが出る場合

筆者の環境では make でエラーが出ました。 エラーメッセージは

  poppassd.c:146: conflicting types for `crypt'
  /usr/include/unistd.h:639: previous declaration of `crypt'

でした。 「poppassd.c をコンパイルしようとしたんだけど 146 行で宣言している `crypt' が以前に宣言された型と違います」というエラーです。 poppassd.c ファイルの 146 行の内容は

  char *crypt (char *, char *);   /* To permit long shadow passwords */

です。

crypt() 関数の宣言は unistd.h に含まれて います。poppassd.c では unistd.h をインク ルードしています。よって、冗長なので削除したりコメントアウトしても問題ありません。 poppassd.c ファイルの 146 行を削除しましょう。 コメントアウトするためには以下の様に変更します。

  C 言語の /* */ でコメントアウトする場合

  /* char *crypt (char *, char *);*/   /* To permit long shadow passwords */

  C++ 言語の // でコメントアウトする場合

  // char *crypt (char *, char *);   /* To permit long shadow passwords */

変更したら、また make コマンドでメイクします。

すると、またエラーが出ました。 エラーメッセージは

  cc -o poppassd  poppassd.o -lcrypt
  /usr/i486-linux/bin/ld: cannot open -lcrypt: No such file or directory

でした。 「リンクしようとしたけど crypt というライブラリファイルが無い」 というエラーです。crypt ライブラリに含まれていそうで poppassd が使用している関数は crypt() だと推測されます (ソースを読んで推測しました)。 crypt() 関数は libc.so (libc.so の実体は libc.so.5.4.46) に含まれているので -lcrypt 指定は必要ありません。 よって Makefile ファイルの 6 行目のライブラリの指定をコメントアウトします。 メイクファイルのコメントマークは # です。

  LIBS    = -lcrypt # -lshadow

の一行を

  LIBS    = # -lcrypt # -lshadow

に変更しました。

変更したら、また make コマンドでメイクします。 筆者は上記の 2 ヶ所の変更でメイクに成功しました。

注意)libc.so に含まれている関数はライブラリのバージョンによって 違う場合があります。libc.so.5.4.46 以外のライブラリを使用している 場合は libcrypt.so 等が必要な場合があります。 例えば、ライブラリが glibc2 の場合は libc.so.6crypt() 関数が入っていませんので libcrypt を リンクする必要があります。