2013-02-21 7 views
8

GNU Makeを使って、多くの人が使うC/C++プロジェクトをビルドしている。このプロジェクトには多くのオプションファイルが存在し、各ユーザーはMATLABインターフェイスを通じてそれらのファイルを選択し、コマンドライン引数(make OPTS = 'XYZ'など)を使用してmakefileに提供されるため、makefileは一般的なものになります。GNU gccコールの後に "トラップを中止する:6"を作るが、呼び出しは単独で実行すると有効になる

makefileを使用すると、正しいオブジェクトの依存関係が正しく識別され、次にそれらのオブジェクトのソース前提条件が検索され、ビルドされます。しかし、オブジェクトルールを実行しようとするたびに、gccコールの直後に "Abort trap:6"というエラーが出ます。

vpath %.c $(PATH) $(OBJ_DIR) 
# Pick compilers 
CC1=g++ 
CC2=gcc 
LNK=g++ 
# Assign variables for c/cpp implicit rules 
CXXFLAGS= $(CCFLAGS) $(DEFINES) $(INCLUDES) 
CFLAGS = $(CCFLAGS) $(DEFINES) $(INCLUDES) 

# Assign various user-defined values 
OUTPUT = -o $(USER_LIB) 
C_OBJECTS = $(patsubst %.c,$(OBJ_DIR)/%.o,$(C_SOURCES)) 
CPP_OBJECTS = $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(CPP_SOURCES)) 
OBJECTS = $(C_OBJECTS) $(CPP_OBJECTS) $(SIM_OBJECTS) 

# User Library Dependencies and Compilation Rules 
$(USER_LIB): $(OBJECTS) 
    $(LNK) $(LINKERFLAGS) $(CCFLAGS) $(DEFINES) $(INCLUDES) $(OUTPUT) $(OBJECTS) 

$(OBJ_DIR)/%.o: %.c 
    $(CC2) $(CFLAGS) -c -o [email protected] $< 

を次のようにMakefileのがあると私は何を得るの例は次のとおりです。ちょうど(

gcc -g -D(the defines) -I(all the includes) -c -o obj1/xyz.o ../common/xyz.c 
make: *** [obj1/xyz.o] Abort trap: 6 

しかし、私はそのEXACT同じgccの電話を取ると、コマンドライン上でそれを実行した場合コピー&ペースト)、ファイルが正しくコンパイルされ、オブジェクトファイルがobj1フォルダーに配置されます。

私は何かを見つけることができるかどうかを見るために 'make -d'を見ようとしました。出力はクレイジーなので、その要点は次のとおりです。

... output truncated for brevity ... 
gcc -g -D(the defines) -I(all the includes) -c -o obj1/xyz.o ../common/xyz.c 
Putting child 0x104f13cc0 (obj1/xyz.o) PID 24557 on the chain. 
Live child 0x104f13cc0 (obj1/xyz.o) PID 24557 
Reaping losing child 0x104f13cc0 PID 24557 
make: *** [obj1/xyz.o] Abort trap: 6 
Removing child 0x104f13cc0 PID 24557 from chain. 

この時点で出力が終了します。私もmake -kを実行して、最初のエラーの後に何が起こるかを見てみました。 1つのソースファイルごとに同じ結果が得られます。ここでも、各ソースファイルは、個別に実行されたときに使用される正確な呼び出しでコンパイル可能です。

この時点で私は完全に失われています。このコンテキストでは、「トラップの中止:6」の意味に関する情報はほとんどありません。

Xcodeでインストールされたgcc-4.2でMac OSX 10.7を実行しています。

現在、.cppファイルのルールが存在しないことを認識していますが、現時点ではまだコンパイルするための.cppソースファイルがありませんが、将来はサポート構造がサポートされています遠い

私を助けることができる人のために事前にありがとう。

EDIT: "make -d"出力から1行追加されました。 編集:追加された解決策(回答に移動)

+0

メイクファイルを呼び出すとき

numberOfItems < 0 

場合は、このようなエラーが発生します。エラーが 'make'から来ていることを確かに知っていますか?つまり、 'make 'がgccやサブシェルによって実際に生成されるエラーに合格していないのでしょうか? –

+0

こんにちは!どのように私はそれを調査するだろうか?コマンドラインからGCCを呼び出すと、GCC自体でエラーが発生しないことがわかります。私はあなたがそれを置くようにサブシェルからどうかをチェックする方法を知らない。 –

+0

'OS x" gnu make ""を中止してトラップを中止しました:6 "'、Xcode、OSのアップグレードなどに関するいくつかのものを見つけました。 'make clean'で始めると同じエラーが出ますか? –

答えて

5

助けを借りて、私の自身の質問に答えました。 解決済み: まず、@ MadScientistの「Abort trap:6」のコメントを参照してください。

私は、システム変数$(PATH)と混同される可能性のある変数を使用することを認識しました。 私がそれを期待どのように次の行を解釈していなかったしてください表示されます。

vpath %.c $(PATH) $(OBJ_DIR)      <------ Bad 

問題を引き起こしてきたことがあり、システム変数$(PATH)といくつかの干渉があるように見えます。 vpath変数を$(SRC_PATH)に変更するだけで、システム変数との干渉や潜在的な干渉がなくなり、問題が解決されます。

vpath %.c $(SRC_PATH) $(OBJ_DIR)     <------ Good 

レッスン学んだ:変数名には注意してくださいとあなたの環境変数が何であるかを知っています。

"Abort trap:6"が意味することを指摘し、環境問題を示唆していることを、@MadScientistに教えてください。

0

コードにアサートメソッドがある場合、そのエラー(アボートトラップ:6)を取得できます。例えば

assert(numberOfItems >= 0); 

、あなたは私が前にそのようなエラーに遭遇したことがありません

関連する問題