【问题标题】:make: *** No rule to make target `gcc', needed by `libmy.so'. Stopmake: *** 没有规则来制作目标“gcc”,这是“libmy.so”所需要的。停止
【发布时间】:2013-02-02 10:13:16
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

  • 也许你有空格而不是制表符?
  • 写 LIB = -llibmy?我相信这应该可以解决问题。 -l 告诉链接器按名称链接库。
  • @RefugnicEternium 这将解决链接器错误,但这里是 make 本身窒息。
  • 不应该是OBJ = $(CC) -c -fPIC $(SRC)OBJ = mylib.o
  • @user786653 绝对应该。将其发布为答案。

标签: c makefile shared-libraries


【解决方案1】:

问题出在下面一行:

$(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

【讨论】:

  • 他还需要添加规则生成$(OBJ)
  • @Christoph 不一定。 make 具有编译 C 的隐含规则:它调用 $(CC) $(CFLAGS) -o $@ $<
  • @H2CO3:你是对的 - 我错过了,因为我从不依赖隐含规则
  • 但这不会在此处生成 .so 文件。
  • @Elfayer:根据手册,确实没有生成共享库的隐含规则;生成目标文件的隐式规则是$(CC) $(CPPFLAGS) $(CFLAGS) -c,顺便说一句
【解决方案2】:
$(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

【讨论】:

    【解决方案3】:

    这行得通:

    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) in fclean

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-14
      • 2015-06-11
      • 2014-06-07
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多