私はGNUMakeを使用して、多くの人が使用するC /C++プロジェクトを構築しています。このプロジェクトには多くのオプションファイルがあり、各ユーザーはMATLABインターフェイスを介してそれらのファイルを選択し、コマンドライン引数(make target OPTS ='XYZ'など)を介してmakefileに提供されるため、makefileは一般的なものにしようとします。
makefileを使用すると、正しいオブジェクトの依存関係が正しく識別され、それらのオブジェクトのソースの前提条件を見つけてビルドします。ただし、オブジェクトルールを実行しようとするたびに、gcc呼び出しの直後に「トラップの中止:6」というエラーが表示されます。
Makefileは次のとおりです
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 $@ $<
そして私が得るものの例は次のとおりです:
gcc -g -D(the defines) -I(all the includes) -c -o obj1/xyz.o ../common/xyz.c
make: *** [obj1/xyz.o] Abort trap: 6
ただし、まったく同じ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を実行して、最初のエラーの後に何が起こるかを確認しました。すべての単一のソースファイルは同じ結果を生成します。繰り返しになりますが、各ソースファイルは、独立して実行されたときに使用される正確な呼び出しでコンパイルできます。
私はこの時点でこれに完全に夢中になっており、この文脈で「トラップの中止:6」が何を意味するかについての情報はほとんどありません。
Xcodeを介してgcc-4.2がインストールされたMacOSX10.7を実行しています。
現在、.cppファイルのルールはないことを認識しています。現在、コンパイルする.cppソースファイルはありませんが、将来的にはサポート構造が存在する可能性があります。
よろしくお願いします。
編集:「make-d」出力から1行を追加しました。編集:追加された解決策(回答に移動)