2011-05-31 14 views
1

見つかったすべての.cpp個のファイルを1つの出力ファイルにコンパイルすると、指定されたディレクトリから再帰的に降りるクリーン/ポータブルな方法はありますか?私はmakefileがこの種のことができるかどうか、あるいはそれが何らかのビルドスクリプトの仕事であるのかどうかはわかりませんが、私は自分のコードと一緒にいろいろなIDEのプロジェクトファイルを保守したくありません。ポータブルでディレクトリ全体をコンパイル

+0

私の議論は、まずスクリプトを使ってリスト中のすべての '.cpp'をアセンブルしてから、そのリストを好みのコンパイラへの入力として送ります。このプラットフォームを信頼できる形で実行するスクリプトはわからないので、私はこれをコメットとして保存します。 :) – Xeo

+0

@Xeo少なくとも私は各プラットフォームのスクリプトを一度書く必要があります。 – Maxpm

+0

@ Xeo:これはメイクファイルで直接行うことができます - 以下の私の答えを見てください。 –

答えて

2

ここではさまざまなことができます。私はマルチプラットフォームのビルドシステムを使用し、そのドキュメントに従うことをお勧めします。私は過去にCMakeを使いましたが、コンパイルする方法を知らないので、すべてのファイルをディレクトリに入れてください。

利点は、ほとんどの一般的なIDEのプロジェクトファイルを生成するためにCMakeを使用することができるため、VisualStudioユーザーはVSソリューション、MacOSXユーザーはXcodeプロジェクトを生成し、Eclipse CDKプロジェクトはほとんどすべての環境で、Makefile ...

2

そうのようなパターンを一致させるために使用することができますwildcard functionがあります:

CXX_FILES = $(wildcard src/*.cpp) # All .cpp files in the directory 

これは再帰的ではありませんが、少なくとも、手動で特定のディレクトリ内のファイルを指定することからあなたを救うでしょう。それらを構築するためのルールは次のようなものになります。

CXX_FILES = $(wildcard src/*.cpp) # All .cpp files in the directory 
OBJ_FILES = $(CXX_FILES:src/%.cpp=$(OBJ_DIR)/%.o) # Corresponding .o files 

# Rules 
all: $(OBJ_FILES) 
    g++ $(OBJ_FILES) -o output_filename 

$(OBJ_DIR)/%.o: src/%.cpp 
    g++ -c $< -o [email protected] 

ああ、そしてあなたの質問に答えるために、この方法は完全に移植可能です。

+0

*完全に移植可能であれば、それはCP/Mでも動作するのでしょうか?そのオペレーティングシステムには*ディレクトリ*という概念がないためです。そして、あなたが明らかに依存しているGNU Makeのないプラットフォームをお持ちの場合はどうでしょうか?またはGCCがインストールされていないシステム? –

+0

+1は質問に答えるためです。しかし、私は 'SConstruct'のような最近のツールを使うことをお勧めします。ゲインはこのシナリオでは明白ではないかもしれませんが、突然1つを除いてすべての '.cpp' **をコンパイルする必要がある場合は、あなたに役立つpythonの力がすべてあります:) – ereOn

+1

-1なぜなら、完全に質問に答える。 –