为c / c ++写一个通用的makefile:编译器抱怨“ / bin / sh:1:./main.o:Exec格式错误”

问题描述 投票:0回答:1

我正在学习makefile,并尝试为c / c ++编写通用的makefile。我要定位的文件结构如下:

 |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

有人可以告诉我如何解决此问题吗?我是makefile的菜鸟。非常感谢!

makefile g++
1个回答
0
投票

它在链接上不会失败。它甚至没有到达链接线。该语句失败:

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

shell对该行的解释如下:

  • OBJ变量设置为./coolthing.o
  • 执行./main.o命令

由于无法直接执行目标文件,因此会记录一条错误消息:

./main.o: Exec format error

如果只需要获取要链接的对象列表,则应利用前提条件,并在链接语句中仅使用$^而不是$(OBJ)并删除此OBJ生成行。

© www.soinside.com 2019 - 2024. All rights reserved.