我想将.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)
提前感谢您的帮助。
答案 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