GNU在gcc调用后生成“Abort trap:6”但是单独执行时调用有效

我正在使用GNU Make来构建一个很多人都会使用的C / C ++项目。 makefile尝试通用,因为此项目中有许多可选文件,每个用户通过MATLAB接口选择这些文件,然后通过命令行参数提供给makefile(make target OPTS =’XYZ’等…)。

当我使用makefile时,它正确识别正确的对象依赖项,然后继续查找这些对象的源先决条件并构建它们。 但是,每次尝试执行对象规则时,我都会在gcc调用之后收到错误消息“Abort trap: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”在这种情况下意味着什么的信息非常少。

我正在运行Mac OSX 10.7,并通过Xcode安装了gcc-4.2。

我意识到目前没有针对.cpp文件的规则,我目前没有任何.cpp源文件可以编译,尽管将来很可能会有这样的原因,到目前为止它有支持结构。

提前感谢任何可以帮助我的人。

编辑:从“make -d”输出中添加了一个前进行。 编辑:添加解决方案(转移到答案)

在帮助下,回答了我自己的问题。 解决:首先看看@MadScientist关于“Abort trap:6”的评论。

鉴于线索我意识到我使用的变量可能与系统变量$(PATH)混淆。 似乎Make没有解释以下行我的预期:

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

看起来系统变量$(PATH)存在一些干扰,可能导致问题。 只需将vpath变量更改为$(SRC_PATH)即可消除与系统变量的冲突和任何潜在的干扰,从而解决问题。

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

经验教训:注意变量名称并了解您的环境变量。

感谢@MadScientist指出“Abort trap:6”意味着什么并提出了环境问题。

如果代码中有断言方法,则可以得到该错误(中止陷阱:6)。

例如:

 assert(numberOfItems >= 0); 

如果

 numberOfItems < 0 

调用makefile时会出现这样的错误