• 締切済み

make実行時のエラーについて

makeについてお尋ねします(先日、お尋ねした件の延長なのですが)。 あるプログラムソース群からの実行ファイルの作成に関する質問です。 以下操作手順です。 ------------ 1. configure.sh というのが用意されていて、中を見てみたら私の計算機のコンパイラの状況などを調べたりして、make.incを出力しています。それは所定の場所に置かれます。これをマニュアルどおり実行しました。 2. その場所(ソース群とかmakefile,make.incがあるフォルダ)でmakeを実行しました。makeはmakefile, make.incを読み込んでいます。make.incがmakefileから呼ばれている記述も確認しました。 makeを実行すると、makefileの以下の部分がおかしいとしてmakeが終了します。 c.o: $(CC) -c $(CFLAGS) $(INCS) $*.c メッセージとして、 cc -c -I hoge.c cc: fetal error: no input files ----------- $(CC),$(CFLAGS),$(INCS) というのはcc, スペース, -I を意味するようですが、これはどこで指定されるのでしょうか。 make.incの中にはそのようなものを指定するところはありませんでした。Fortranコンパイラは調べて調整されていることが分かり、"FC= gfortran -O3" というような記述が見えます。configure.shを使って調査したことが分かります。 また、cc -c -I abc.c は、-Iでインクルードファイルのフルパスを指定なのでしょうか。man ccによるとそういう風です。 $(INCS)を削除すればいいのかもですが、一応、セットとして導入されているものなので、どこで副作用が出るかわからないのでそのままにしているのですが。理屈が分からないので、自発的に編集することをためらっています。 make全般ですが、どういう分野に属するのでしょうか。C言語の1分野でもなく、必ずしもLinuxの習得の中に組み込まれているわけでもないように見えます。学習するシステムとしてどこに属するのかということですが。その場その場でアドホックに調べて習得していくものなのでしょうか。 if......fiというようにフィーリングではわかるのですが、しっかり説明されるような学習の場面がないのですが。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.7

>ということは、環境変数かLinuxの仕様で決まっているのではないでしょうか。 #6で私が書いている事わかりませんでしたか? makeには組み込み変数があり、makefile等で定義しなくてもmake自体で定義している変数があるんです(変数なのでmakefile等で再定義する事も可能)。 CCはたいてい組み込み変数で定義されてるかと思います。 環境変数で定義してあるかどうかはprintenvなりコマンドで確認できますよね? なんで「こうなってますよ」と話してる事を無視されて、独自の解釈をしようとなさるのかはわかりませんけど・・

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.6

>$(CC) , $(CFLAGS), $(INCS)ですが、makefileの中はここだけであり、config.sh,にはないので環境変数としか思えません。 環境変数としか思えない根拠は何でしょうか? 環境変数に存在してるんでしょうか? makeは未定義の変数が参照された場合、その値は空ですよ。 なのでCFLAGSは未定義なだけかと。 また組み込み変数もあり多くの場合、CCはccで定義されてると思います。 INCSについてはわかりません。 makeって基本的な動作は大体同じですけど方言がかなりあるので makeだけだとちょっとわからない事が多いです。

skmsk1941093
質問者

お礼

回答ありがとうございます。 >環境変数としか思えない根拠は何でしょうか? >環境変数に存在してるんでしょうか? makeno $(CC) -c $(CFLAGS) $(INCS) $*.c の部分を cc -c -I hoge.c とみなしている、すなわち$(CC)をccと解決できています。 そしてそのような指示はmakefile, make.incの中にないです。 ということは、環境変数かLinuxの仕様で決まっているのではないでしょうか。 Linuxが立ち上がってlsコマンドが無条件で起動する(ですかね?)というのと同じ理屈かも。いずれにしてもmakeで定義しているわけではない、ということですが。 環境変数は自分で.bashrcなどを編集して決めてユーザが自発的に決めるのだろうと思いますが、今、使用しているものは、比較的最近インストールしたubuntuで環境変数を自分で編集したという覚えはありません。というか、それをしようと思ったらまた文法を復習する必要があり、exportだのsource .bashrcの実行だのしなければなりませんが、そういうのは一切やっていません。 そういう意味で$(CC)をccと解釈してくれる仕組みも不明なのですが。環境変数のデフォルトという考え方があるのでしょうか。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

>ifで始まったものがfiで閉じるというようなところはカンでわかります。elseなども想像できます。ただし、小さな文法で最後にコロン;を付けるのか付けないのか、というようなところでいつもどうだっけとなります。 コードを書く上では、そういう細かな文法を知っておく必要ありますけど、読むだけなら大体把握できるだけでもよろしいかと。 それと私が#4で書いているのは「configure.shがmake.incにどのような内容を出力するつもりだったのか」ですから、シェルの(言語仕様でわかる)部分だけわかってもダメですけど。 シェルスクリプトから呼び出されるコマンドについてもわかってないと。

skmsk1941093
質問者

お礼

回答ありがとうございます。 今回、やや思いついたこと(;とかfiとか)まで含めて書きまして余談になってしまいました。やはり、コマンドがどこから呼ばれたのかを突き止める必要はあります。config.sh, makefileの中を見るわけですね。make.incはconfig.shで作られるので捜索の対象から外します。 話が元に戻ってしまいますが、makeが中断した箇所は以下の通りです。makefileの中の1行です。 $(CC) -c $(CFLAGS) $(INCS) $*.c $(CC) , $(CFLAGS), $(INCS)ですが、makefileの中はここだけであり、config.sh,にはないので環境変数としか思えません。 $(CC)→cc $(CFLAGS)→空白(設定なし) $(INCS)→ -I ということは間違いないのですが。 -Iのあとにインクルードファイルのフォルダを指定する必要があるのだろうと推測していますが。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

質問のケースでいえば、makeだけを知っていればいいというだけではなく、configure.shがmake.incにどのような内容を出力するつもりだったのかを調べる必要があるかと。

skmsk1941093
質問者

お礼

回答ありがとうございます。 ご指摘もその通りだと思います。.sh ということなのでシェルの書式も知らないといけないのですが、私は習熟とは程遠いです。経験が少なく、こうすれば間違いないという実感がありません。 ifで始まったものがfiで閉じるというようなところはカンでわかります。elseなども想像できます。ただし、小さな文法で最後にコロン;を付けるのか付けないのか、というようなところでいつもどうだっけとなります。Pythonなども含めて数多くの言語でコロンありなしの区別の法則がマチマチではないかと思います。今回、configure.shが通ってはいるのでそのようなミスがないはずですが、経験が少ないので疑いは残ってしまいます。疑うところのカンが持てないということですね。

  • _kappe_
  • ベストアンサー率68% (1578/2300)
回答No.3

INCSが"-I "だけになってしまったのだろうと回答No.2で書きましたが、CFLAGSが"-I"でINCSが空だった可能性もありました(そういう使い方はあまりしないと思います)。 何にせよ、-Iオプションの後にはディレクトリの指定が必要です。

skmsk1941093
質問者

お礼

回答ありがとうございます。 このような変数がいったいどこで指定されているのか、も調べたいと思います。もちろん、私が手入力で指定したことはありません。.bashrcあたりに環境変数を記述するはずですが、正式な書式をマスターしてはいません。

  • _kappe_
  • ベストアンサー率68% (1578/2300)
回答No.2

Cコンパイラの-Iオプションを使ったことはないでしょうか。 makefileに c.o: $(CC) -c $(CFLAGS) $(INCS) $*.c と書かれていて cc -c -I hoge.c cc: fetal error: no input files というエラーが出るということから、INCSの内容が"-I "だけだったのだろうと分かります。 "-I /opt/xxx/include"のように、ヘッダファイルを探すディレクトリの指定がINCSに設定されるのが正しい姿であろうと思われます。つまり、実行するCコンパイラのコマンドは cc -c -I /opt/xxx/include hoge.c のような形になります。 INCSの内容が"-I "だけになってしまった結果hoge.cが-Iの引数(ディレクトリ)だと判断されてしまい、コンパイル対象のファイル(input files)がコマンドに含まれていない、というエラーが出たわけです。 makefileやmake.incなど関連するファイルの中で変数INCSを設定している場所をまずは探してください。それを見て、INCSの内容が"-I "だけになってしまった原因を調べる必要があります。 想像ですが、環境変数とか何かのファイルで指定することになっている設定を見落としたか書き間違えたかしているのではないかと思います。

skmsk1941093
質問者

お礼

回答ありがとうございました。 私もご指摘の通りではないかと思っていました。しかし、makeに関してカラクリがわからなかったので確信はありませんでした。どこから引いてきているか不明な$(CC)などが使われており、その辺を整理したいと思っていました。そうしないと完全なコントロール下に置いた気がしないので。 ひとまず、-Iのあとに続くインクルードファイルが保存されているフォルダ指定について検討します。

  • f272
  • ベストアンサー率46% (8446/18087)
回答No.1

> makefileの以下の部分がおかしいとしてmakeが終了します。 hoge.cって存在するんですか? > $(CC),$(CFLAGS),$(INCS) というのはcc, スペース, -I を意味するようですが、これはどこで指定されるのでしょうか。 そのmakefileで指定される。インクルードファイルになっていることもある。他にはコマンドラインで与えられることもあったり,環境変数として与えられることもある。 > -Iでインクルードファイルのフルパスを指定なのでしょうか フルパスとは限らない。パス指定であればよい。 > その場その場でアドホックに調べて習得していくものなのでしょうか。 単なるコマンドなのだから,コマンドのマニュアルを読むのが基本です。

skmsk1941093
質問者

お礼

回答ありがとうございました。 > hoge.cって存在するんですか? はい。それはもちろん。中身も見ています。cc -c -I hoge.cは動作しませんが、cc -c hoge.cは動作します。 -Iを除けばいいのかということですが、セットで提供されているので外したらダメじゃないかと思っているのです。 > $(CC),$(CFLAGS),$(INCS) というのはcc, スペース, -I を意味するようですが、これはどこで指定されるのでしょうか。 >そのmakefileで指定される。インクルードファイルになっていることもある。他にはコマンドラインで与えられることもあったり,環境変数として与えられることもある。 makefile, make.incには指定箇所がありませんでした。とすると、環境変数になるのだろうと思いますが、それは環境による(つまり個人による設定)のだから期待した動作にならないこともあるだろうなあとは思いますが。 > -Iでインクルードファイルのフルパスを指定なのでしょうか > フルパスとは限らない。パス指定であればよい。 パス指定ということですが、何に対するパスでしょうか。 cc -c -I hoge.c の場合はhoge.cに対するパスを示せばいいということは、cc -c -I /home/aaa/bbb/hoge.cというようにするのか、 cc -c -I /home/aaa/bbb hoge.cというように-Iはフォルダを指定するだけということでしょうか。 相対パスだったら cc -c -I ../bbb/hoge.c ということでしょうか。 > その場その場でアドホックに調べて習得していくものなのでしょうか。 > 単なるコマンドなのだから,コマンドのマニュアルを読むのが基本です。 Linuxにはコマンド集という本もあるのですが、コマンドはどのように呼び出されるかという問題は残りますね。環境変数、makeに明記、環境変数でなくても動作するコマンド(っていうことになるでしょうか。lsは環境変数指定で呼び出されているわけではないと思っていますが)もあると思います。 makeはマスターすると便利だと思いますが、自信がないところ、あやふやな部分が少しでもあると、主戦場のソースコードではないところでトラブルがあるかも知れない可能性が増えるわけですね。makeはゆるぎなく理解している必要がある、あるいは全部理解しているわけではないけど、このような使い方だったら絶対にmake側に問題はないというところまでもっていく必要があると思いました。 そういう意味でコマンドラインのターミナルでの投入に習熟するのとは違うスキルとかカラクリの理解が必要ではないかと思うのですが。

関連するQ&A

専門家に質問してみよう