【发布时间】:2018-08-31 01:08:16
【问题描述】:
我正在开发一个我在项目中使用的(或多或少随机的)c 函数库。它的前一个化身在目标中列出并手动编译了每个 .c、.o 文件:
$(CC) $(SRCDIR)/somefoo.c $(CFLAGS) ... -c -o $(OBJDIR)/somefoo.o
这变得令人厌烦、不准确和痛苦,我想创建一个更友好、更好的 Makefile,我可以将其用于任何项目。谷歌搜索后,阅读(O'Reily 的“使用 GNU Make 管理项目”)并认为我想出了:
BIN = /usr/bin
SH = $(BIN)/bash
CC = $(BIN)/cc
AR = $(BIN)/ar
RL = $(BIN)/ranlib
RM = $(BIN)/rm
CP = $(BIN)/cp
RL = $(BIN)/ranlib
TC = $(BIN)/touch
MK = $(BIN)/make
FND = $(BIN)/find
TAR = $(BIN)/tar
RM = $(BIN)/rm
CFLAGS = -Wall -Wextra -Wpedanitc -pedanitc-errors\
-w -Waddress -Walloc-zero -Walloca -Warray-bounds\
-Wno-deprecated -Wno-div-by-zero -Werror -Wfatal-errors\
-Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wdouble-promotion\
-Wrestrict -Wnull-dereference -Wjump-misses-init -Wshadow\
-Wformat=2 -Wformat -Wformat-security -pedantic --std=c99 --march=native
DEBUG = -g -ggdb -gstabs
OPTIM = -faggressive-loop-optimizations -fassociative-math -O3
LIBS = -lm -lcommonC #add more here
INC = -I/usr/include -I/usr/local/include -I$(INCDIR)
LIBPATH = -L/usr/lib -L/usr/lib64 -L/usr/local/lib -L/usr/local/lib64 -L$(LIBDIR)
MKFLAG = -f
PACK = $(TAR) -cvs
EXTRACT = $(TAR) -xf
PREFIX = /path/to/project #root directory of the project
BINDIR = $(PREFIX)/bin #stores Makefile, shell scripts, README, LICENSE, data files...
INCIDR = $(PREFIX)/include #holds .h files for the project
SRCDIR = $(PREFIX)/src #holds source files
OBJDIR = $(PREFIX)/obj #holds generated object files
LIBDIR = $(PREFIX)/lib #holds generated or included .a files
EXEDIR = $(PREFIX)/exe #generated executable(s)
DESTDIR ?= #where the tar file will be unpacked, user defined.
SRC = $(wildcard $(SRCDIR)/*.c) #all .c source files
OBJ = $(patsubst %.c,%.o,$(wildcard *.c)) #.o files
LIB ?= $(wildcard $(LIBDIR)/*.a) #the .a
EXE = $(EXEDIR)/project #generated executable
MKE = $(BINDIR)/Makefile #Makefile, used for cleaning before packing the project
TARF ?= #tar file for project.tar, user defined
.PHONY: obj exe update test clean pack install
# up to $(EXE) updated thanks to "Renaud Pacalet"
obj: $(OBJ)
exe: $(EXE)
$(OBJ): %.o: %.c
$(CC) $< $(CFLAGS) $(LIB) $(INC) $(LIBPATH) $(LIBS) $(OPTIM) -c -o $@
$(EXE): $(OBJ)
$(CC) $^ $(CFLAGS) $(LIB) $(INC) $(LIBPATH) $(LIBS) $(OPTIM) -o $@
update: $(SRC)
$(TC) $(SRC)
clean:
$(RM) $(OBJ) $(EXE) $(LIB)
pack:
$(MK) $(MKFLAG) $(MKE) clean && $(PACK) $(PREFIX) $(TARF)
install:
cd $(DESTDIR) && $(TAR) $(EXTRACT) $(TARF)
我的问题是 SRC、OBJ 和编译目标的声明 .c -> .o SRC = ... 工作正常,但由于某种原因没有生成相应的 obj 文件?感谢您的所有意见。
更新:感谢 Renaud Pacalet,我找到了 OBJ/SRC 变量。我收到一个错误:
make: Nothing to be done for 'obj'
这通常意味着目标是最新的。我注意到我的组织缺乏细节,所以我添加了 cmets 来描述每个变量引用的内容。我之前的大部分项目都使用过这个组织方案,直到现在我都没有遇到过这个问题。
感谢您的所有意见。
--约旦。
-- 乔丹。
【问题讨论】: