2

こんにちは(私はWindows、mingw g ++コンパイラおよびmingw32-makeを使用しています)
私の質問を一般化するために、次のようにc++ソースファイルを書く方法を学びたいと思います。

foo.cppがfoo.hに依存していると仮定すると、foo.cppはsrc \にあり、foo.hはinclude\にあります。
// foo.cpp
#include "foo.h"

通常はこのように書くだけです
//foo.cpp
#include "..\include\foo.h"

しかし、プロジェクトが成長し、より多くの組織が必要になり始めると、この方法は十分に動的ではないことがわかりました。foo.hを新しいディレクトリ(たとえば、include \ bar \ foo.h)に移動する場合は、すべてのファイルのすべてのインクルードを変​​更する必要がある理由です。これを達成するためのmakeの方法はありますか?もしそうなら、ヘッダーファイルの依存関係についても行うことができます。

ちなみに、私はmakefileを初めて使用します。これらがコード内にあるので、これらのインクルードが存在することを知っているかどうかさえわかりません(実際、私が理解していることから、そうではありません)。それは私を不幸な二次的な質問に導くでしょう、それはこれらが含まれているのを見ることができますか?そうでない場合は、変更できるように変更することはできますか?インクルードをmakefileにリンクするのではなく、ファイルにインクルードすることで、これを間違った方法で行っていると感じているので、この問題にどのように取り組むかを自由に答えてください。

4

2 に答える 2

5

コンパイラは、.hファイルを探すために常にいくつかのデフォルトパスを調べています。パスを追加できます。

たとえば、パスを含むgcc複数の引数を取ります。-Iあなたの中foo.cppで:

#include "foo.h"

そしてコンパイルするときあなたは言う:

g++ -I../include foo.cpp -c [other options]

質問の2番目の部分について:makefileとの呼び出しmakeは、通常、コンパイルされるファイルとプロジェクトについて何も知りません。ただし、その印象につながるデフォルトの変数とディレクティブがいくつかあります。ご使用の環境では、CFLAGSまたはCPPFLAGS変数を変更するだけで-I-argumentを追加するだけで、機能する可能性があります。

于 2013-02-15T19:06:55.533 に答える
2

Patrick Bは、コンパイラにどこからインクルードするかを知らせる方法について非常によく答えていますが、次のビットについては答えていません。

ちなみに、私はmakefileを初めて使用します。これらがコード内にあるので、これらのインクルードが存在することを知っているかどうかさえわかりません(実際、私が理解していることから、そうではありません)。それは私を不幸な二次的な質問に導くでしょう、それはこれらが含まれているのを見ることができますか?そうでない場合は、変更できるように変更することはできますか?

いいえ、makeは、ソースファイルに何が含まれているか、または他のファイルにどのように依存しているかを理解していません[makeは、C、C ++、Fortran、Pascal、ADA、Lisp、Cobol、またはHaskellでプログラミングしているかどうかも気にしません。ファイル間に「このようなファイルがあり、何かをしてそのようなファイルが必要な場合」の関係がある限り、makeはそれをソートします。

これを行うにはいくつかの方法があります。手動で追加できます:

 foo.cpp: foo.h

または、インクルードファイルに依存関係ファイルを使用して、makeこれを追加することにより、自動的にビルドすることができます。次に例を示します。

 SOURCES = foo.cpp    # Add any further source files here. 
 INCLUDES = -I../includes   # Add other include directories if needed. 

 CFLAGS += ${INCLUDES}

 TARGET = foo.exe   # in Windows. Just foo in linux/MacOS.

 all: ${TARGET} deps.mk

 ${TARGET}: ${SOURCES}
     gcc -O $@ $^      

 desp.mk: ${SOURCES}
     gcc -MM ${INCLUDES} $^ > $@

 include deps.mk

makefileは、タブであるインデントに依存していることに注意してください。この投稿ではスペースを使用しているため、受信を「集計」する必要があります。また、「適切な」makefileでは、などfoo.oから作成し、すべての異なるファイルをリンクすることに注意してください。そうすれば、大規模なプロジェクトではコンパイルがかなり速くなります。読みやすくするために簡略化しました。foo.cpp.o

多分私は少し拡張する必要があります:

gcc -MM「コンパイル」されているファイルとそのすべての依存関係のリストを(標準化して)提供します。実際にコードをコンパイルすることはありません(そして、コードが少なくともある程度コンパイル可能である限り)、ファイルを問題なく処理します。

詳細gcc -MMおよび関連については、GCC呼び出しのドキュメントを参照してください。

$@$&^は「自動変数」と呼ばれるものです。makeこれらは「ターゲット」(矢印を発射するためのターゲットのように見えるため、覚えやすい)と「すべての依存関係」(ここでは視覚的な手がかりはありません)に拡張されます。恐れて-そして時々、私は自分自身に思い出させなければなりません)。詳細については、こちらをご覧ください。

于 2013-02-15T19:21:32.753 に答える