Написание универсального make-файла для c / c ++: жалоба компилятора "/ bin / sh: 1: ./main.o: Exe c error format" - PullRequest
0 голосов
/ 24 марта 2020

Я изучаю make-файл и пытаюсь написать универсальный make-файл для c / c ++. Файловая структура, на которую я нацеливаюсь, выглядит следующим образом:

 |root
    | Makefile
    | inc
      |- commmon.hpp
      |- sourcelib
        |-coolthing.hpp (#include <common.hpp>)
    | src
      |- main.cpp (#include <sourcelib/coolthing.hpp>)
      |- sourcelib
        |-coolthing.cpp (#include <sourcelib/coolthing.hpp>)

Это то, что у меня сейчас есть:

IDIR=inc
SRCIR=src
BIN=name

CC=g++
CFLAGS=-I $(IDIR) # specify where to find the headfiels

DEPS=$(shell find ./$(IDIR) -name "*.hpp") #find all the header files
CSRCS=$(shell find ./$(SRCIR) -name "*.c") #find all the .c file
CPPSRCS=$(shell find ./$(SRCIR) -name "*.cpp") #find all the .cpp file

COBJ=$(CSRCS:.c=.o)
CPPOBJ=$(CPPSRCS:.cpp=.o)

all: $(BIN)

%.o: %.cpp $(DEPS)
    ${CC} -c $^ $(CFLAGS)

%.o: %.c $(DEPS)
    ${CC} -c $^ $(CFLAGS)

$(BIN): $(COBJ) $(CPPOBJ)
    OBJ=$(shell find . -name "*.o") # find all the object file in the directroy of this Makefile
    $(CC) -o $@ $(OBJ)

Компилятор может успешно создать объектный файл исходных кодов. Однако, когда он пытается связать файлы .o, компилятор выдает эту ошибку.

 g++ -c src/main.cpp inc/common.hpp inc/sourcelib/coolthing.hpp -I inc
 g++ -c src/sourcelib/coolthing.cpp inc/common.hpp inc/sourcelib/coolthing.hpp -I inc
 OBJ=./coolthing.o ./main.o  
 /bin/sh: 1: ./main.o: Exec format error   Makefile:24: recipe for
 target 'name' failed   make: *** [name] Error 2

Может кто-нибудь подсказать, как решить эту проблему? Я нуб, чтобы сделать файл. Большое вам спасибо!

1 Ответ

1 голос
/ 26 марта 2020

Не сбой при связывании. Он даже не достигает линии связи. Ошибка этого оператора:

OBJ=./coolthing.o ./main.o 

Эта строка интерпретируется оболочкой следующим образом:

  • устанавливает OBJ переменную в ./coolthing.o
  • execute ./main.o команда

Поскольку объектный файл не может быть выполнен напрямую, регистрируется сообщение об ошибке:

./main.o: Exec format error

Если все, что вам нужно, это получить список объектов для ссылки, Вы должны использовать свои предварительные условия и просто использовать $^ вместо $(OBJ) в своем заявлении на связывание и удалить эту строку генерации OBJ.

...