8

私は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行を追加しました。編集:追加された解決策(回答に移動)

4

2 に答える 2

5

助けを借りて、私自身の質問に答えました。解決済み: 最初に、"Abort trap: 6" とは何かについての @MadScientist のコメントを参照してください。

その手掛かりから、システム変数 $(PATH) と混同される可能性のある変数を使用していることに気付きました。Make は、次の行を期待どおりに解釈していないようです。

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

問題を引き起こしている可能性のあるシステム変数 $(PATH) に何らかの干渉があるようです。vpath 変数を $(SRC_PATH) に変更するだけで、システム変数との競合や潜在的な干渉が解消され、問題が修正されます。

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

教訓: 変数名に注意し、環境変数が何であるかを理解してください。

「Abort trap: 6」の意味を指摘し、環境の問題を示唆してくれた @MadScientist の功績。

于 2013-02-22T14:34:06.443 に答える