make:***没有规则来制作`libmy.so'所需的目标`gcc'。停止

时间:2013-02-02 10:13:17

标签: c makefile shared-libraries

我想将.c文件编译为.so(共享库)。 我不明白为什么,我有那个让我错误的makefile:

LIB = libmy.so

SRC =   lib.c

CC = gcc

OBJ = $(CC) -c -fPIC $(SRC)

all: $(LIB)

re: fclean all

$(LIB): $(OBJ)
        $(CC) -shared -fPIC $(OBJ) -o $(LIB)

clean:
        $(RM) $(OBJ)

fclean: clean
        $(RM) $(LIB)

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

问题出在以下几行:

$(LIB): $(OBJ)

扩展时会变为:

libmy.so : gcc -c -fPIC lib.c

因此错误。

你可能想要的是:

OBJ = lib.o

为了节省您必须手动将所有.c源文件转换为.o,您可以使用此类规则而不是OBJ = lib.o

OBJ = $(SRC:%.c=%.o)

这会创建一个变量OBJ,其中包含SRC中所有文件的列表,其中任何.c扩展名已更改为.o。例如。如果我们有SRC = foo.c bar.c,则上述规则会自动扩展为:

OBJ = foo.o bar.o

答案 1 :(得分:0)

$(LIB): $(OBJ)

扩展为

libmy.so: gcc -c -fPIC $(SRC)

即您将食谱放入依赖列表中,并正确地抱怨。

就个人而言,我会像这样编写makefile:

CC := gcc
RM := rm -f

LIB := libmy.so
OBJ := lib.o
GARBAGE := $(OBJ)

.PHONY: all clean realclean

all: $(LIB)

$(LIB): LDFLAGS += -shared
$(LIB): $(OBJ)
    $(CC) $(LDFLAGS) -o $@ $<

$(OBJ): CFLAGS += -fPIC
$(OBJ): %.o : %.c
    $(CC) $(CFLAGS) -c -o $@ $<

realclean: GARBAGE += $(LIB)
clean realclean:
    $(RM) $(GARBAGE)

请注意,您的原始版本不包含制作$(OBJ)的规则。如果您想使用隐式广告,则需要将-fPIC添加到CFLAGS

答案 2 :(得分:0)

有效:

LIB = libmy.so

SRC =   lib.c

CC = gcc

OBJ = $(SRC:.c=.o)

all: $(LIB)

re: fclean all

$(LIB):
        $(CC) -c -fPIC $(SRC)
        $(CC) -shared -fPIC $(SRC) -o $(NAME)
clean:
        $(RM) $(OBJ)

fclean: clean
        $(RM) $(LIB)

我只需要OBJ = $(SRC:.c=.o)

中的fclean