0

我想将 .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)

提前感谢您的帮助。

4

3 回答 3

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
于 2013-02-02T10:17:52.253 回答
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)。如果你想使用隐式的,你需要添加-fPICCFLAGS.

于 2013-02-02T10:18:46.090 回答
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

于 2013-02-05T18:20:24.013 回答