プロが教えるわが家の防犯対策術!

cryptcatをmacOSのソースからビルドしようとすると、
下記のようなエラーがたくさん出ます。

netcat.c:227:3: error: implicit declaration of function 'close' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
close (netfd);
^
netcat.c:228:3: error: implicit declaration of function 'sleep' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
sleep (1);

ご経験のある方で、直し方が分かる方がおられましたら情報いただければ幸いです。

よろしくお願い致します。

A 回答 (4件)

No1です。


すみません、先にご紹介したシェルスクリプト"mkprglist"の最初の部分...

find . -follow -name "*.txt" -exec mklist {} \; >> ./prglist.tmp

ですが...

find . -follow -name "*.txt" -exec mklist {} \; > ./prglist.tmp

の誤りでした。お詫びして訂正いたします。
    • good
    • 0

No1です。


C言語などとは全く関係のない、私が勝手に作った方法ですが...
次のリストに示す2つのシェルスクリプトを作成します。

名前を"mkprglist"とします。

#!/bin/csh -f
echo " 出力ファイル名はprglist.tmpです。"
echo ""
echo -n " よければ'リターンキー'を押してください。"
set wait = $<
find . -follow -name "*.txt" -exec mklist {} \; >> ./prglist.tmp
find . -follow -name "*.h" -exec mklist {} \; >> ./prglist.tmp
find . -follow -name "*.c" -exec mklist {} \; >> ./prglist.tmp
find . -follow -name "*.cpp" -exec mklist {} \; >> ./prglist.tmp
find . -follow -name "makefile*" -exec mklist {} \; >> ./prglist.tmp
find . -follow -name "Makefile*" -exec mklist {} \; >> ./prglist.tmp
find . -follow -name "*.def" -exec mklist {} \; >> ./prglist.tmp
find . -follow -name "*.src" -exec mklist {} \; >> ./prglist.tmp
find . -follow -name "*.htm" -exec mklist {} \; >> ./prglist.tmp
find . -follow -name "*.xml" -exec mklist {} \; >> ./prglist.tmp

名前を"mklist"とします。

#!/bin/csh -f
#
# 1.$1
# 表示させるファイル名を指定します。
#
#
echo ""
echo -n "++++++++++ファイル名:"
echo -n "$1"
echo "++++++++++"
echo ""
cat "$1"
echo ""

ファイルを作成した後、実行権を付加します。

1.ソースファイルの最上位ディレクトリの位置で mkprglist を起動します。
起動メッセージに対してEnterキーで答えます。

2.カレントディレクトリに prglist.tmp ファイルが(巨大な)作成されます。

3.このファイルをエディタで開くと以下の抜粋のようなリストになります。

void set_input_precision (mpc_fun_param_t *params, mpfr_...
void set_reference_precision (mpc_fun_param_t *params, mpfr_...

#endif /* __MPC_TESTS_H */


++++++++++ファイル名:./src/get_x.c++++++++++

/* mpc_get_dc, mpc_get_ldc -- Transform mpc number into C comp...
mpc_get_str -- Convert a complex number into a string.

Copyright (C) 2009, 2010, 2011, 2020 INRIA

4.全てのソースファイルが一つになりますので、検索キーワードで幾らでも探せます。

5.キーワード"+++++++..."を指定すれば、検索したワードを含むファイル名も簡単に確認できます。

6.VisualStudioでは、キーワードを全関係ファイルを検索する機能を持ちますが、極々単純ですがそれに相当する機能としていつも使ってます。
    • good
    • 0

No1です。


問題のエラーが発生するnetcat.cはC言語のソースです。一方ご指摘のfarm9crypt.ccはC++のソースファイルですので、その中で...

extern "C" { #include "farm9crypt.h" }

でインクルードされているとすれば、farm9crypt.hはC言語のモジュールとして扱っていることになります。それ故、問題のfarm9crypt_initialized()関数プロトタイプがfarm9crypt.hファイルに格納されているのなら、それをC言語であるnetcat.cから利用するためには、単純に...

#include "farm9crypt.h"

で良いように思います。
ただ、問題は『何故この様な混乱が起きてしまったのか。』なのですが、考えてみても私にはよく解りません。
    • good
    • 0
この回答へのお礼

後、一つだけ下記のエラーが出るのですが、

netcat.c:1457:2: error: implicit declaration of function 'helpme' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
helpme(); /* exits by itself */

C99のhelpme()関数のインクルードファイルを探す方法とかあれば
教えてください。

お礼日時:2022/07/21 18:30

『C99では関数'close'の暗黙の宣言は駄目よ。

』と言っているわけで、つまり関数の『プロトタイプがない。』と怒っているわけです。
そもそもの原因は『これら関数のプロトタイプが格納されたヘッダファイルがインクルードされていない。』と考えるのが素直だと思います。

●関数'close'や'sleep’の実態はcryptcatソースコードの中にあるのでしょうか...
それぞれの関数がソースコード内に有るのならば、関数のプロトタイプを含むヘッダファイルも無ければおかしいと思います。

●関数の実態はソースの中にない...
つまり外部のライブラリからリンクされる関数だということになります。
それが上記のようなエラーに繋がると仮定すると...

1)そもそも必要なライブラリがインストールされていない。
2)ライブラリは有っても、そのプログラム開発キットであるヘッダファイルがインストールされていない。

などが考えられます。このような想定原因ならば、恐らくconfigure実行中に何かメッセージが表示されるのではないかと思われます。YES/NOの結果を注意深く確認するか、あるいはconfigure.logの中身をエディタで覗くこともできます。
ビルドの前にソフトウエアの依存ライブラリなどもう一度チェックすることも解決に近づく方法と思われます
    • good
    • 0
この回答へのお礼

上記エラーは、
#include <unistd.h>
することで出なくなったのですが、まだ

netcat.c:1510:5: error: implicit declaration of function 'farm9crypt_initialized' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
if (farm9crypt_initialized() == 0) {
^
netcat.c:1511:2: error: implicit declaration of function 'farm9crypt_init' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
farm9crypt_init(crypt_key_f9);

のようなエラーが出ます。これらの関数は、
farm9crypt.ccの中で,
extern "C"
{
#include "farm9crypt.h"
}
されているのですが、(farm9crypt.hは同ディレクトリにあります。)
cc -O -DGAPING_SECURITY_HOLE -DFREEBSD -o cryptcat netcat.c farm9crypt.o twofish2.o -lstdc++
するとエラーが出てしまうようなのですが、何が悪いのでしょうか?

お礼日時:2022/07/21 17:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!