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

Ale*_*uck 8 c makefile gnu-make

我正在使用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 $@ $<
Run Code Online (Sandbox Code Playgroud)

我得到的一个例子是:

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

但是,如果我采用那个完全相同的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.
Run Code Online (Sandbox Code Playgroud)

此时输出结束.我也试过运行make -k来看看第一次出错后会发生什么.每个源文件都会产生相同的结果.同样,每个源文件都可以与独立完成时使用的确切调用进行编译.

在这一点上我完全迷失了这一点,关于"Abort trap:6"在这种情况下意味着什么的信息非常少.

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

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

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

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

Ale*_*uck 5

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

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

vpath %.c $(PATH) $(OBJ_DIR)                        <------ Bad
Run Code Online (Sandbox Code Playgroud)

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

vpath %.c $(SRC_PATH) $(OBJ_DIR)                    <------ Good
Run Code Online (Sandbox Code Playgroud)

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

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