【发布时间】:2021-12-09 16:50:18
【问题描述】:
我对 Make 很陌生。我正在尝试编写一个 Makefile 来构建一个中型 Linux C/C++ 应用程序,如下所示。
通过将所有源文件放在一个位置并明确列出源文件来制作一个简单的 Makefile 对我来说可以,但我希望它更通用。
我的所有源文件(C 和 C++)都在不同子目录的 src 文件夹中。我在 inc 和 inc/common 文件夹中有头文件,然后在 lib 文件夹中有库。
Makefile 在同一层运行:
SRC_DIR := src
OBJ_DIR := obj
BIN_DIR := bin
CXX := /bin/arm-linux-gnueabi-g++
EXE := $(BIN_DIR)/runfile
SRC := $(shell find $(SRC_DIR) -name *.cpp -or -name *.c)
OBJ := $(patsubst $(SRC_DIR)/%,$(OBJ_DIR)/%,$(addsuffix .o,$(basename $(SRC))))
CPPFLAGS := -Iinc -Iinc/common -MMD -MP
CXXFLAGS := -std=c++11 -Wall
LDFLAGS := -Llib
LDLIBS :=
.PHONY: all clean
all: $(EXE)
$(EXE): $(OBJ) | $(BIN_DIR)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
$(OBJ_DIR)/%.o: $(SRC) | $(OBJ_DIR)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
$(BIN_DIR) $(OBJ_DIR):
mkdir -p $@
clean:
@$(RM) -rv $(BIN_DIR) $(OBJ_DIR)
-include $(OBJ:.o=.d)
我在运行它时遇到很多错误,如下所示,包括打开依赖文件的问题。我想我快到了,但看不到我的错误:
compilation terminated.
/bin/arm-linux-gnueabi-g++ -Iinc -Iinc/common -MMD -MP -std=c++11 -Wall -c -o obj/main.d.o
cc -Llib obj/main.d.o -o obj/main.d
/usr/bin/ld: obj/main.d.o: relocations in generic ELF (EM: 40)
/usr/bin/ld: obj/main.d.o: relocations in generic ELF (EM: 40)
/usr/bin/ld: obj/main.d.o: error adding symbols: file in wrong format
【问题讨论】:
-
考虑使用github.com/cppfw/prorab 它将大大简化您的
makefile并使其通用
标签: c++ linux gcc makefile g++