template examples create c makefile gnu-make

examples - makefile linux c



GNU Make "Abort trap: 6" después de la llamada a gcc; sin embargo, la llamada es válida cuando se ejecuta solo (2)

Con ayuda, respondió mi propia pregunta. RESUELTO: Primero vea el comentario de @ MadScientist para saber qué es "Abortar trampa: 6".

Dada esa pista, me di cuenta de que uso una variable que podría confundirse con una variable del sistema, $ (RUTA). Parece que Make no estaba interpretando la siguiente línea como lo esperaba:

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

Parece que hay alguna interferencia con la variable del sistema $ (RUTA) que puede haber estado causando problemas. Simplemente cambiando la variable vpath a $ (SRC_PATH) elimina el conflicto con la variable del sistema y cualquier interferencia potencial, lo que soluciona el problema.

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

Lección aprendida: tenga cuidado con los nombres de las variables y sepa cuáles son sus variables de entorno.

Gracias a @MadScientist por señalar qué significa "Abortar trampa: 6" y sugerir problemas ambientales.

Estoy usando GNU Make para construir un proyecto de C / C ++ que muchas personas usarán. El archivo MAKE intenta ser general porque hay muchos archivos opcionales en este proyecto y cada usuario selecciona esos archivos a través de una interfaz MATLAB que luego se proporcionan al archivo MAKE a través de argumentos de línea de comando (hacer que el objetivo sea OPTS = ''XYZ'', etc.).

Cuando uso el archivo MAKE identifica correctamente las dependencias de objeto correctas, luego procede a buscar los requisitos previos de origen para esos objetos y los construye. Sin embargo, cada vez que intenta ejecutar una regla de objeto me sale un error que dice "Abortar trampa: 6" justo después de la llamada gcc.

El Makefile es el siguiente

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 $@ $<

y un ejemplo de lo que obtengo es:

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

Sin embargo, si tomo esa misma llamada gcc EXACTA y la ejecuto en la línea de comandos (solo copie y pegue), el archivo se compila correctamente y el archivo del objeto se coloca en la carpeta obj1.

Traté de ver ''make -d'' para ver si podía encontrar algo tampoco. Dado que la producción es loca por mucho tiempo, la esencia de esto es la siguiente:

... 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.

en ese punto, la salida finaliza. También intenté ejecutar make -k para ver qué sucede después del primer error. Cada archivo de origen único produce el mismo resultado. Una vez más, cada archivo fuente es compilable con la llamada exacta que se usa cuando se realiza de forma independiente.

Estoy completamente perdido en este punto y hay muy poca información sobre lo que significa "Abortar trampa: 6" en este contexto.

Estoy ejecutando Mac OSX 10.7 con gcc-4.2 instalado a través de Xcode.

Me doy cuenta de que no existe una regla para los archivos .cpp en la actualidad, en este momento no tengo ningún archivo fuente .cpp para compilar, aunque en el futuro es probable que haya una razón por la cual haya una estructura de soporte hasta el momento.

Gracias de antemano por cualquiera que pueda ayudarme.

EDITAR: Agregó una línea que procede de la salida "make -d". EDITAR: Solución agregada (movida a una respuesta)


si hay un método assert en su código, puede obtener ese error (abort trap: 6).

por ejemplo:

assert(numberOfItems >= 0);

y si el

numberOfItems < 0

obtendrá ese error cuando llame al archivo MAKE