【问题标题】:How do I make a makefile for creating a library and output file?如何制作用于创建库和输出文件的 makefile?
【发布时间】:2021-05-25 15:00:03
【问题描述】:

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

我的目录树
~/home$ 树

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

这是我的生成文件

.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

我认为它有效,但它不起作用。 我得到一个 ar: ../libsrc/myfunc.o: No such file or directory 错误 以及在 src 目录中创建的 myfunc.o 文件。

我想得到类似的文件

.
├── 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$ 树

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

谁能帮忙?

【问题讨论】:

  • 你能描述一下实际的问题吗?什么不工作?你有错误吗?
  • 最简单的方法是:改用cmake。它是为人类设计的。
  • “不起作用”从来都不是一个好的问题描述。请提供预期结果与实际结果。同时提供完整的构建日志。
  • 我在我的 makefile 中设置了归档文件的目标文件的路径,但我得到一个 ar: ../libsrc/myfunc.o: No such file or directory error and myfunc object file created in src directory .
  • 重复:显示您的构建日志。还可以在构建后显示您的实际目录树。

标签: c linux makefile


【解决方案1】:

请注意,此论坛使用 Tab 缩进,因此如果您复制粘贴以下 Makefile,请使用例如修复缩进。 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 $@

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

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2021-12-18
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多