• 締切済み

makefileでのファイル指定について

プログラムを実行するためのコンパイルでは、makeを使うことが多いと思います。makefileというファイルにその内容を書いておくわけですが、makeというのは必要なものをかき集めて(不必要なものは集めない)セットしていくということなるわけですね。ファイルを集めるというのは結局はフォルダを指定するということなのですが、そのフォルダとは相対パスで指定するのか、絶対パスで指定するのか考え方を教えて頂きたいのですが。私の予想では当然ながら相対パスが普通だということなのですが。また絶対パスでもいいということにもなるでしょうか。./とかつけてフォルダ指定すると相対パスになるとか。makeは苦手でそこを確認したいと思いました。 あと、必ずではありませんが./configureとかしますが、これは何をしているのでしょうか。 よろしくお願いします。OSとしてはWindows, WSLというところでの利用を考えています。

みんなの回答

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

>追加で1つ質問ですが、make.incっていうのは特別な機能があるのでしょうか。 そのmake.incを使うものを組んだ人たち次第なのでドキュメントを読んでください。 make.incという名前からある程度は想像できますけど、絶対にそうしなければならないという決まりはありませんので。

skmsk1941093
質問者

お礼

回答ありがとうございました。 incということなのでincludeファイルだとは思います。 makeというコマンドがmakefileという名前に対して(脊髄反射的に)反応するのは間違いないはずで、makefileの中で呼ばれてるんだろうなとは思います。つまりmakeはmake.incには直接には対応しない、ただ呼び出されるのだろうと予想します。 ※makeは簡単、という評価がありますが、慣れないと肝心のプログラム開発(こちらが戦場)と同じように難航しそうです。今回はこちらがプログラム開発のカヤの外なのでこちらが型にはまってしまえばいいのですが、開発者が、”そんなの当たり前”と思って説明の手を抜くと混乱しそうですが。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.3

>今回、WIndowsなのですが、configure.exeはありません。 configureの多くはautoconfを使ってconfigure.inから作られるshellスクリプトなので・・・ cmakeを使うって手もありますが。 >makeも複数あってどれが動けば都合がいいのかわかりません。 INSTALLなどのドキュメントファイルに想定しているmakeなど書かれてることもあります。 >呼び出されるmakeによって仕様が違うんだろうなあとは思います。 はい、makeによって違います。 linuxのディストリビューションだとGNU makeがほとんどでしょうけど。

skmsk1941093
質問者

お礼

ありがとうございます。 追加で1つ質問ですが、make.incっていうのは特別な機能があるのでしょうか。 makeにダイレクトに結びつくのはmakefileのみだと思っていたのですが。make.incがどうのこうのというreadmeのようなファイルを読んでいるところなのですが。

  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.2

>makeというのは必要なものをかき集めて(不必要なものは集めない)セットしていくということなるわけですね。 違います。makeは必要なファイルを集めたりはしません。不必要なファイルを集めない、ということもしません。 makefileは「ファイルAがファイルBより古かったらコマンドCを実行しなさい」というのが、複数、記述されている物です。 そして、コマンドCは「ファイルAを、ファイルBよりも新しくするコマンド」にしておきます。 なお、コマンドCを「ファイルAを新しくしないコマンド」にしておくと、いつまでもファイルAが新しくならないので「毎回、コマンドCが実行される」と言う事になります。 このように「風数のファイルの依存関係」と「新旧逆転している場合にすべきこと」を書いておくのがmakefileです。 例えば「ソースファイルAは、ヘッダファイルBに依存している」つまり「ソースファイルAはヘッダファイルBを利用している」と記述して、ヘッダファイルBの方が新しい場合は「ソースファイルAの更新時間を現在時間に変えるコマンド」を指定します。 それと同時に「コンパイル済みオブジェクトファイルCは、ソースファイルAに依存している」と記述して、ソースファイルAの方が新しい場合は「ソースファイルAをコンパイルして、コンパイル済みオブジェクトファイルCを更新するコマンド」を指定します。 この状態でmakeを行うと「ヘッダファイルBまたは、ソースファイルAが編集されて新しくなってたら、コンパイルして、コンパイル済みオブジェクトファイルCが新しくなる」と言う事が起きます。 なので「依存関係を書き間違える」と「実行する必要のないコマンドを毎回実行する」とか「実行する必要のあるコマンドを実行しないので、ソースファイルを書き換えた内容が最終実行ファイルに反映されない」などの問題が起きます。 >私の予想では当然ながら相対パスが普通だということなのですが。また絶対パスでもいいということにもなるでしょうか。 ファイルを指定する際の「パス」は「自由」なので、相対パスでも絶対パスでも、何でも構いません。重要なのは「依存関係が正しく記述されているかどうか」だけです。 >あと、必ずではありませんが./configureとかしますが、これは何をしているのでしょうか。 ./configureには「コンパイラやライブラリアンなどが、正常に動くための、初期設定コマンド」を書いておきます。そして、依存関係記述を工夫して「makeのたびに、毎回実行する」としておけば、毎回、正しく初期設定されます。例えば「gnu-cでコンパイルする初期設定」を書いておけば、異なるCコンパイラを使う環境になっている状態でも、正しくgnu-cでコンパイルされます。つまり「複数のコンパイラを使い分けしている場合」を想定している訳です。 ソースレベルでプログラムを公開しようとした場合、利用者が正しく環境設定してコンパイル出来るようにするのが、./configureを用意しておく理由です。

skmsk1941093
質問者

お礼

懇篤なご説明をありがとうございます。私は、今まで、長くても数万行のプログラム程度までしか編集してきませんでした。そのため、毎回全部1つのファイルにまとめてすべてコンパイルするということをやってきたのでソースプログラムが分散しているとかライブラリが別のところにあるとかそういう環境がありませんでした。コンパイルに時間がかかるということは全くなく、makeにしなければならないという積極的な理由を感じませんでした。ところが、ここへきて開発者が別の人のプログラムセットがあり、ソースファイル群が50ぐらいあって、何をするかによってコンパイルするファイルを取捨選択したりするようです。私は先の書いたように1つのソースあるいは、多くても2,3個のソースだけでやってきたので、すべてを1つのフォルダに入れてソースとかオブジェクトを羅列する(gfortran a.f95 b.f95 c.f95 xxx.o)ということしかしてきませんでしたので、あちこちに分散している(場合によってはフォルダさえ違う)ファイルを"集めて"コンパイルする、それがmakeだという印象をもったわけです。ご説明で、依存関係上コンパイルしなければならないものと、しなくてもいいものを選択してコンパイルの効率化を図るということをしているのかなと思ったのですが、先ほどにも書いたように私がやっているような全部まるっきりコンパイルしてしまえばそれはそれで問題ないということになるのでしょうか。 この質問の動機としては前述のように、makeで何を作るかをコントロールする必要が生じたので確認でお尋ねしました。 環境はWindows10なのですが、which make -aとすると、候補が4つぐらい出てきてmakeによって結果が違うんだろうなあと思います。インストールしたら勝手に入ってきて、パスすら設定されているという状態です。GnuWin32\binが最初に来るからこれだったら標準かな思いますが。Linuxだったらmakeは1つであり、OSがしっかり管理しているはずですね。 動作がおかしいときに何を疑っていいのかわからなくなったのでこの辺からお尋ねしたところです。

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

> makeというのは必要なものをかき集めて(不必要なものは集めない)セットしていくということなるわけですね。 オプションなし,引数なしで実行させると,makefileを参照して,makefileのデフォルト処理を行う。たいていはコンパイルやリンクを行うことで実行ファイルを作成することが多い。 「ファイルを集める」というのとはイメージが異なる。実行ファイルを作成するのなら,必要なファイルがあって,その指定は相対パスでも絶対パスでもなんでもかまわない。とはいえ相対パスでの指定の方が移植性が格段に良い。 configureはインストールに必要な環境変数やライブラリが正しく設定,設置されているか等をチェックする。その結果としてmakefileが作成される。

skmsk1941093
質問者

お礼

ありがとうございました。Linuxでは以下の手順を毎度ブラックボックスのようにやっていました。 ./configure make clean make make install 今回、WIndowsなのですが、configure.exeはありません。 makeも複数あってどれが動けば都合がいいのかわかりません。呼び出されるmakeによって仕様が違うんだろうなあとは思います。WSLに移してそこでやるかなとは思いますが、生のWindowsの環境でやれたらいいとは思っています。

関連するQ&A

  • Makefile.inとMakefile.am

    回路設計をするためにsystemCをlinux(centOS)にインストールしました。サンプルプログラムの入ったディレクトリがあってそのサンプルプログラムをコンパイルして実行したいです。ところがコンパイルの仕方がわかりません。 例)rsaというディレクトリの内容 [root@localhost rsa]#ls -l -rw-r--r--. 1 root root 2023 11月 27 21:24 2012 Makefile.am -rw-r--r--. 1 root root 16276 11月 27 21:24 2012 Makefile.in -rw-r--r--. 1 root root 2072 11月 27 21:24 2012 README -rw-r--r--. 1 root root 14137 11月 27 21:24 2012 rsa.cpp -rw-r--r--. 1 root root 4644 11月 27 21:24 2012 rsa.vcproj 予想するに、systemCをインストールするときに $./configure $make $make install と打ったので、Makefile.inとMakefile.amがあやしいと思うのですが、これをどのように使ったらよいのやらわかりません。 教えてください。もしくは、参考文献などを教えてください。 すみません。

  • MakefileのLDLIBSとLOADLIBESの違いについて

    どうもこんにちは 趣味でプログラムを作っています。 make コマンドを使ってコンパイルしているのですが、Makefile のマクロ(変数?)でちょっとわからないものがあります。 最初から用意されているマクロで、LDLIBSとLOADLIBESというものがありますが、これらはどのように使用するのでしょうか? webで調べてみると、リンクするライブラリのパスを指定するマクロのようですが、両者の違いがよくわかりません。 どちらかを適当に選んで使えばいいのでしょうか? それとも、まったくの別物でしょうか?

  • フォルダ参照ではなくファイルを指定したい。

    フォルダの参照ダイアログボックスを使用して ファイルを選択できるようにしています。 プログラムでcsv形式で保存し、そのcsv形式ファイルを指定して開くという動作を目的としています。 そのファイル選択を固定でなく可変で選択したいと思っています。 Dim ShellApp As Object Dim oFolder As Object Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "ファイル選択", &H4000,"C:\test") msgbox(oFolder) このような感じで、フォルダのみではなくファイルを指定することに成功しました。 しかし、このフォルダ参照ダイアログが表示されたときに、何も選択せずに キャンセルボタンをクリックするとエラーが出て止まってしまいます。 目的とする動作はできてはいるのですが、キャンセルするとエラーになるので、この原因がわからず困っています。 キャンセルボタンに関することを記述する必要があるのでしょうか? また、この他にファイルを指定するのに適した方法がありましたら教えてください。 参照するフォルダを指定しているのでパスの取得は必要ありません。 ファイルが選択できたらOKです。 フォルダのパス取得のプログラムはよくサンプルを見かけるのですが、 ファイル選択のサンプルはあまり見かけないです(-_-;) また、この方法ではC:\と絶対パスで指定していますが、exeファイルが存在する場所からの相対パスでの指定はできないのでしょうか? csvで保存する時は"./test/test.csv"などと記述して書き込みできていたのですが、 このようなパスを書くとエラーとなりファイルを見つけられないといわれてしまいます。

  • makefile のvpath

    makefile でvpathを指定してファイルを探索させる場合について質問です。 ファイルをmake が検索した結果、どこのディレクトリのファイル をmakeの処理で使用したかを確認したいのですが、どのようにしたらよいのでしょうか。 宜しくお願い致します。

  • makefileが見つかりません。

    つい最近Cygwinを使ってC言語を始めたものです。 make app=ファイル名を実行したところ、 「make: ☆☆☆ターゲットが指定されておらず、makefileも見つかりません.中止」と出てしまいます。 原因はなんなのでしょうか? パソコン自体も初心者なので設定自体が正しく完了できていないかもしれません。 用語も全然わからないので初心者向けにアドバイスしていただけると助かりますm(_ _)m

  • 相対パスの指定

    FindFirstFile(), remove(), OPENFILENAME などのファイルやフォルダのパスを扱うものについて、例えば 実行ファイルと同じディレクトリに有るdat.datというファイルを「dat.dat」とだけ書いて相対指定したつもりが、実行ファイルと同じディレクトリにdat.datが無かった場合にWindowsフォルダなどの特殊なフォルダや、AUTOEXEC.BATに書いてあるフォルダを使ってdat.datが検索されて適用されたりすることはあるのでしょうか? いろいろな関数や構造体が有りますが、相対パスが指定されたとき、絶対パスを作るために使用されるフォルダパスが、GetCurrentDirectory()以外のものが使われることってあるんでしょうか?

  • makefileの中のソースプログラム指定について

    プログラムをコンパイル・リンクして実行ファイルを作成するためのmakeの利用についてお尋ねします。mekefileを編集してmakeコマンドを投入すればあとは指示通りに実行ファイルを作成してくれるわけですが、ソースプログラムを指示するところではすべてのファイル名を記入する必要があるのでしょうか。それともワイルドカードというか、*.f90のようにフォルダ内のすべての.f90を対象にして処理するように指示できないでしょうか(途中で出力されるオブジェクトファイルもですが)。ソースファイルが小分けにして50個ぐらいあるのですが。よろしくお願いします。 Windows10上でのGnu make ver 4.1です。

  • gfortranでmakefile

    gfortranのmakefileを作成し、"make test"と実行しても成功しません。 どうすればいいのでしょうか? どこか間違いがあるでしょうか? 下にmakefileを全文載せましたのでアドバイスをよろしくお願いします。 OBJS = main.o tree.o treef.o test : ${OBJS} gfortran -c test ${OBJS} main.fやtree.fやtreef.fのファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。 ちなみに、"make test"と実行して出てくるエラーメッセージが「makefile:3 *** 最初のターゲットより前にコマンドを起動. 中止.」 です。

  • gfortranでmakefile

    gfortranのmakefileを作成し、"make test"と実行しても成功しません。 どうすればいいのでしょうか? どこか間違いがあるでしょうか? 下にmakefileを全文載せましたのでアドバイスをよろしくお願いします。 OBJS = main.o tree.o treef.o\ test : ${OBJS} gfortran -c test ${OBJS} main.fやtree.fやtreef.fのファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。

  • エクセルのファイルオープン時の指定ファイル名について

    環境:Win2000 VB.NET2003 参照:Microsoft Excel 9.0 Object Library エクセルファイルを開くために、Workbooks.Openを使用していますが、引数にフルパスを指定すると正常にオープンできるのですが、相対パスを指定するとファイルが見つからずに開けないというエラーになってしまいます。 Workbooks.Openでは相対パスは指定できないのでしょうか?それとも、何か他の指定が合わせて必要なのでしょうか? 教えてください、よろしくお願いします。

専門家に質問してみよう