库的Makefile

时间:2012-08-03 07:18:57

标签: c makefile static-libraries

每次我想使用库执行程序时,我必须在终端上运行这4个命令。

这些行是

cc -m32 -c mylib.c
ar -rcs libmylib.a mylib.o
cc -m32 -c prog.c
cc -m32 prog.o -L. -lmylib
./a.out

如何为上述命令创建一个makefile并运行它? 一个详细的程序将不胜感激。感谢。


编辑: 这是解决方案:

a.out: prog.o libmylib.a
      cc prog.o -L. -lmylib

prog.o: prog.c mylib.h

libprint_int.a: mylib.o
      ar -rcs libmylib.a mylib.o

print_int.o: mylib.c mylib.h

clean:
      rm a.out prog.o libmylib.a mylib.o

这在第2行给出了错误,因为我使用了空格而不是制表符。

3 个答案:

答案 0 :(得分:9)

类似的东西:

program_NAME := a.out

SRCS = mylib.c prog.c

.PHONY: all

all: $(program_NAME)

$(program_NAME): $(SRCS) 
    ar -rcs libmylib.a mylib.o
    cc -m32 prog.o -L. -lmylib

可能会让你开始

我自己刚刚开始使用makefiles而且我认为它们非常棘手但是一旦你让它们工作就会让生活变得更轻松(这些充满了bug,但是一些经验丰富的SO人将会有助于修复它们)

至于运行,请确保将文件另存为“Makefile”(大小写很重要)

然后从cmd行(确保你cd到包含Makefile的目录):

$ make

就是这样!

更新

如果中间静态库是多余的,你可以用这样的Makefile跳过它:

program_NAME := a.out

SRCS = mylib.c prog.c
OBJS := ${SRCS:.c=.o}

CFLAGS += -m32

program_INCLUDE_DIRS := 
program_LIBRARY_DIRS :=
program_LIBRARIES := mylib

CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))

CC=cc

LINK.c := $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)

.PHONY: all

all: $(program_NAME)

$(program_NAME): $(OBJS) 
    $(LINK.c) $(program_OBJS) -o $(program_NAME)

答案 1 :(得分:1)

Cprogramming.com中提供了了解make文件的最简单教程。一旦你理解了它,你就可以通过make file手册。

答案 2 :(得分:0)

我认为没有比make命令的官方文档更详细的程序:http://www.gnu.org/software/make/manual/make.html#Overview

基本上你必须创建一个目标并将命令放入其中。目标可以是全部'如果你想在键入' make'时使用它。一个好的makefile肯定会使用变量等来保持它对lib / sources添加的灵活性。