2012-03-18 8 views
1

メイン関数を持つC++ソースはリンクされ、メイン関数を持たないものはリンクされないように、多少の自動メークファイルを書きたいので、C++ソースのmain関数の存在をチェックするアイデアはありますか?C++ソースファイルがmain関数を持っているかどうかを知る方法?

レキシカルまたは文法解析は、この単純なタスクには適していない可能性があります。

既存のコマンドラインツールやライブラリは、この自動タスクに非常に役立ちます。

ありがとうございました!

メイクファイル:

VPATH = include 
CPPFLAGS += -I include 
CFLAGS += -I include 

C_SOURCE := $(shell find . -iname '*.c') 
CPP_SOURCE := $(shell find . -iname '*.cpp') 
D_OBJ := $(subst .cpp,.d, $(CPP_SOURCE)) 
EXE := $(subst .c,, $(C_SOURCE)) 
EXE += $(subst .cpp,, $(CPP_SOURCE)) 

.PHONY: all 
all: $(EXE) 

include $(D_OBJ) 

$(D_OBJ): %.d: %.cpp 
    $(CC) -MM $(CPPFLAGS) $< > [email protected]; 
    auto_depend_gen [email protected] "[email protected]" > [email protected]; 
    rm -rf [email protected] 

#print_msg: 
# @printf "$(EXE)\n" 
# @printf "$(D_OBJ)\n" 

.PHONY: clean 
clean: 
    rm $(EXE) $(D_OBJ) 

だから、これは依存関係の自動生成メイクファイルです。このメイクファイルでは、C++ソースファイルを追加するたびにmakefileを変更する必要はありません。ヘッダーは "gcc -MM"コマンドで決定され、リンクしたいオブジェクトファイルは、サフィックス以外のヘッダーファイルと同じ名前を共有します。 auto_depend_genは自分で作成したプログラムで、 "gcc -MM"によって生成されたファイルの最初の行の.o接尾辞を削除するだけです。

ソースファイルの中には主な機能がありますが、そうでないものもあります。この問題が発生します。

より一般的な質問ですが、Javaプロジェクトはmain関数を持つ複数の.classファイルで自動的に構築できますが、C++では自動的に作成できません。だから私はただそれを解決したい。

もっとコメントを投稿してください!

+0

簡単なタスク?コンパイルするコードを書いた場合、最も明白なアプローチは、すべてのファイルを解析して主な関数が定義されているかどうかを調べるのではなく、ファイルに名前を付けることですメイン関数 "main.cpp" – Castilho

+0

何とリンクしていますか?なぜあなたは 'main'を別の方法で扱う必要がありますか? –

+0

与えられたプロジェクトで変更する可能性は低いので、私はコマンドライン引数としてmainを使ってcppファイルを指定するか、makeファイルの先頭にconfig設定を指定します。 –

答えて

4

nmを使用すると、オブジェクトファイル内のシンボルを一覧表示できます。 mainがその1つであるかどうかを確認してください。

+0

それは動作します!どうもありがとうございました! – jacksonsc

+0

多くの作業は、コンパイラ自体によって行われます。 – jacksonsc

+0

nmは、ストリップされたオブジェクトファイルまたはパックされたオブジェクトファイルでは機能しません。 – 01100110

1

このLinuxコマンドを使用すると、main()関数でファイルのリストを与える必要があります:

grep -Er 'main\s*\(' * | cut -d':' -f1 

あなたはこのリストが複数のファイルを持っているケースを処理する必要があります。

+1

Er ...コメントと文字列リテラルでメインが発生した場合、このコマンドは失敗します。 – jacksonsc

+0

もっと正確な解決策を探したいだけです。 – jacksonsc

関連する問題