女士们,先生们,你好。
我正在尝试用C创建一个Makefile,它将创建两个库,一个静态,一个共享。
到目前为止,我的Makefile适用于静态部分。
项目文件结构:
//root
//root/src
值得一提的是,该Makefile还在我的根项目目录和/ src目录中创建* .o。
该怎么做,它只在/ src目录中创建目标文件?
生成文件:
SNAME = libmy_printf_`uname -m`-`uname -s`.a
DNAME = libmy_printf_`uname -m`-`uname -s`.so
SRC = $(wildcard src/*.c)
OBJ = $(SRC:.c=.o)
CC = gcc
RM = rm -f
CFLAGS = -W -Wall -ansi -pedantic -Werror -g3 -fPIC
LDFLAGS = -L. -l$(NAME)
STATIC: $(OBJ)
$(CC) -c $(SRC)
ar r $(SNAME) $(OBJ)
ranlib $(SNAME)
DYNAMIC: $(OBJ)
$(CC) -c $(SRC)
$(CC) -shared -o $(DNAME) $(OBJ)
.PHONY: my_printf_static
my_printf_static: $(STATIC)
.PHONY: my_printf_dynamic
my_printf_dynamic: $(DYNAMIC)
.PHONY: all
all: my_printf_static my_printf_dynamic
.PHONY: clean
clean:
$(RM) $(OBJ)
.PHONY: fclean
fclean: clean
$(RM) $(SNAME) $(DNAME)
.PHONY: re
re: fclean all
谢谢!
您的makefile可以归结为:
NAME := libmy_printf_$(shell uname -m)-$(shell uname -s)
SNAME := $(NAME).a
DNAME := $(NAME).so
SRC := $(wildcard src/*.c)
OBJ := $(SRC:.c=.o)
CFLAGS := -ansi -pedantic -Wall -W -Werror -g3 -fPIC
LDFLAGS := -L.
LDLIBS := -l$(...)
.PHONY: all clean fclean re
all: $(SNAME) $(DNAME)
$(SNAME): $(OBJ)
$(AR) $(ARFLAGS) $@ $^
$(DNAME): LDFLAGS += -shared
$(DNAME): $(OBJ)
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
clean:
$(RM) $(OBJ)
fclean: clean
$(RM) $(SNAME) $(DNAME)
re: fclean all
您应该知道很多事情:
不要使用反引号命令,而是将$(shell)
内置函数与:=
赋值运算符结合使用,以防止多次重复运行命令(除非这是所需的行为)。
仅使用一条.PHONY
放在所有规则上方的特殊规则,然后在此处列出。
重新定义$(CC)
或$(RM)
像您所做的变量毫无意义,因为它们已经包含了您想要的内容。
您已编写-l$(NAME)
但未定义NAME
变量。我将其更改为$(...)
因为我无法在这里猜到您真正想要的是什么,所以请不要忘记处理此问题。
使用要创建的目标的名称作为相关规则的名称。作出这样的方式不会重新创建目标,除非你真的想(通过调用clean
,fclean
或re
明确的规则)。
-L
标志和-l
标志不应混入同一变量中,除非在链接命令中放置在正确的位置。实际上,您甚至没有使用它们。按照Make隐式规则,我在LDFLAGS
和LDLIBS
内置变量中明确地将它们分开。
如有任何疑问,请继续。
如注释中所述,如果需要-fPIC
从静态库的编译标志中删除标志,则应考虑在不同目录中构建目标文件:
编辑:我添加了您my_printf_static
和my_printf_dynamic
规则:
NAME := libmy_printf_$(shell uname -m)-$(shell uname -s)
SNAME := $(NAME).a
DNAME := $(NAME).so
SRC := $(wildcard src/*.c)
SDIR := build-static
SOBJ := $(SRC:src/%.c=$(SDIR)/%.o)
DDIR := build-shared
DOBJ := $(SRC:src/%.c=$(DDIR)/%.o)
CFLAGS := -ansi -pedantic -Wall -Werror -W -g3
LDFLAGS := -L.
LDLIBS := -l$(...)
.PHONY: all clean fclean re my_printf_static my_printf_dynamic
all: my_printf_static my_printf_dynamic
my_printf_static: $(SNAME)
my_printf_dynamic: $(DNAME)
$(SNAME): $(SOBJ)
$(AR) $(ARFLAGS) $@ $^
$(DNAME): CFLAGS += -fPIC
$(DNAME): LDFLAGS += -shared
$(DNAME): $(DOBJ)
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
$(SDIR)/%.o: src/%.c | $(SDIR)
$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<
$(DDIR)/%.o: src/%.c | $(DDIR)
$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<
$(SDIR) $(DDIR):
@mkdir $@
clean:
$(RM) -r $(SDIR) $(DDIR)
fclean: clean
$(RM) $(SNAME) $(DNAME)
re: fclean all
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句