C语言 我如何制作一个makefile来创建一个库和输出文件?



我想在lib中创建一个库文件,在bin目录中创建一个输出文件。但是我的makefile不能工作。

我的目录树
~/home$ tree

.
├── bin
├── include
│   └── myhead.h
├── lib
├── libsrc
│   └── myfunc.c
└── src
├── Makefile
└── main.c

这是我的makefile

.SUFFIXES = .c .o
.c.o :
$(CC) $(INC) $(CFLAGS) $<

CC = gcc
CFLAGS = -g -c
AR = ar
OBJECTS = main.o
SRCS = main.c
LIB_TARGET = ../lib/libmyfunc.a
LIB_OBJS = ../libsrc/myfunc.o
LIB_SRCS = ../libsrc/myfunc.c
LIBS = -lmyfunc
LIB_DIR = -L../lib
$(LIB_TARGET) : $(LIB_OBJS)
$(AR) -rcv  $(LIB_TARGET) $(LIB_OBJS)
INC = -I../include
TARGET = ../bin/main
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS) $(LIB_DIR) $(LIBS)
clean :
rm -rf $(OBJECTS) $(TARGET) core

我认为它工作,但它没有工作。我得到一个目录:../libsrc/myfunc。0:没有这样的文件或目录错误和myfunc。

我想要得到像

这样的文件
.
├── bin
│   └── main.out    <-- new
├── include
│   └── myhead.h
├── lib
│   └── libmyfunc.a  <-- new
├── libsrc
│   └── myfunc.c
│   └── myfunc.o    <-- new
└── src
├── Makefile
└── main.c
编辑:

我的构建日志

~/home/src$ make
gcc -I../include -g -c ../libsrc/myfunc.c
ar -rcv  ../lib/libmyfunc.a ../libsrc/myfunc.o
ar: ../libsrc/myfunc.o: No such file or directory
make: *** [Makefile:20: ../lib/libmyfunc.a] Error 1

新建树
~/home$ Tree

.
├── bin
├── include
│   └── myhead.h
├── lib
├── libsrc
│   └── myfunc.c
└── src
├── Makefile
├── main.c
└── myfunc.o

有人能帮忙吗?

注意这个论坛使用制表符缩进,所以如果你复制粘贴下面的Makefiles,一定要使用例如sed -e 's|^ *|t|' -i Makefile来修复缩进。

我会用

LIBSRC  := libsrc
LIBDIR  := lib
BINSRC  := src
BINDIR  := bin
INCDIR  := include
CC      := gcc
CFLAGS  := -Wall -Wextra -O2
LDFLAGS :=
TARGETS := $(BINDIR)/main.out $(LIBDIR)/libmyfunc.a
LIBOBJS := $(LIBSRC)/myfunc.o
.PHONY: all clean
all: $(TARGETS)
clean:
rm -f $(TARGETS) $(BINSRC)/*.o $(LIBSRC)/*.o
$(LIBSRC)/%.o: $(LIBSRC)/%.c
$(CC) $(CFLAGS) -I$(INCDIR) $(LDFLAGS) -c $^ -o $@
$(BINSRC)/%.o: $(BINSRC)/%.c
$(CC) $(CFLAGS) -I$(INCDIR) $(LDFLAGS) -c $^ -o $@
$(LIBDIR)/libmyfunc.a: $(LIBOBJS)
$(AR) -rcv $@ $^
$(BINDIR)/main.out: $(BINSRC)/main.o $(LIBDIR)/libmyfunc.a
$(CC) $(CFLAGS) -I$(INCDIR)/ $(BINSRC)/main.o $(LDFLAGS) -L$(LIBDIR) -lmyfunc -o $@

或者,如果您希望将临时目标文件放在单独的目录中,则写入build/,然后

CC       := gcc
CFLAGS   := -Wall -Wextra -O2
LDFLAGS  :=
BUILDDIR := build
INCDIR   := include
SRCDIR   := src
BINDIR   := bin
LIBDIR   := lib
MAINOBJS := $(BUILDDIR)/main.o
LIBOBJS  := $(BUILDDIR)/myfunc.o
TARGETS  := $(BINDIR)/main $(LIBDIR)/libmyfunc.a
.PHONY: all clean
all: $(TARGETS)
clean:
rm -f $(TARGETS) $(MAINOBJS) $(LIBOBJS) $(BUILDDIR)/*
$(LIBDIR)/libmyfunc.a: $(LIBOBJS)
$(AR) -rcv $@ $(LIBOBJS)
$(BUILDDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -I$(INCDIR) -c $^ -o $@
$(BINDIR)/main: $(MAINOBJS) $(LIBDIR)/libmyfunc.a
$(CC) $(CFLAGS) -I$(INCDIR) $(MAINOBJS) $(LDFLAGS) -L$(LIBDIR) -lmyfunc -o $@

这样做的好处是保持源目录不变。

相关内容

最新更新