我正在学习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的菜鸟。非常感谢!
它在链接上不会失败。它甚至没有到达链接线。该语句失败:
OBJ=./coolthing.o ./main.o
shell对该行的解释如下:
OBJ
变量设置为./coolthing.o
./main.o
命令由于无法直接执行目标文件,因此会记录一条错误消息:
./main.o: Exec format error
如果只需要获取要链接的对象列表,则应利用前提条件,并在链接语句中仅使用$^
而不是$(OBJ)
并删除此OBJ
生成行。