筆者の環境では 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.6 に crypt() 関数が入っていませんので libcrypt を リンクする必要があります。