【问题标题】:How to add "-lm" (LDFLAGS) correctly to this Makefile?如何将“-lm”(LDFLAGS)正确添加到这个 Makefile?
【发布时间】:2019-01-07 22:23:28
【问题描述】:

我有这个完美运行的 Makefile,但我不知道如何添加“-lm”参数。我在 stackoverflow 上找到了很多,但这些 Makefile 示例看起来与我的完全不同。

我应该如何添加“-lm”:

CC=gcc
CFLAGS= -g -pthread -std=gnu99
SRCS =  main.c client.c
DEPS = client.h

EXEC = peer

OBJS= $(SRCS:.c=.o)

all: $(EXEC)
$(EXEC): $(OBJS)
    $(CC) $(CFLAGS) -o $@  $^

%.o: %.c $(DEPS)
    gcc $(CFLAGS) -c $<

run: peer
    ./peer
clean:
    rm $(OBJS)
    rm peer

【问题讨论】:

标签: c ubuntu gcc makefile


【解决方案1】:

当您将目标文件链接到可执行文件中时,库依赖关系会得到解决。您在此步骤中执行此操作:

$(EXEC): $(OBJS)
    $(CC) $(CFLAGS) -o $@  $^

你通常会让你的命令行看起来像这样:

$(CC) $(LDFLAGS) -o $@  $^ $(LIBS)

我已将此处的 $(CFLAGS) 替换为 $(LDFLAGS),因为您通常需要一组不同的标志来链接代码而不是编译代码。

要链接到数学库,您需要在 Makefile 的顶部添加以下内容:

LIBS = -lm -lpthread

给你:

CC=gcc
CFLAGS= -g -pthread -std=gnu99
LIBS = -lm -lpthread
SRCS =  main.c client.c
DEPS = client.h

EXEC = peer

OBJS= $(SRCS:.c=.o)

all: $(EXEC)
$(EXEC): $(OBJS)
  $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)

%.o: %.c $(DEPS)
  $(CC) $(CFLAGS) -c $<

run: peer
  ./peer

clean:
  rm $(OBJS)
  rm peer

链接步骤如下所示:

gcc  -o peer  main.o client.o -lm -lpthread

【讨论】:

  • 好答案。我还建议用$(CC) 替换gcc。就目前而言,$(CC) 唯一控制的是链接步骤,这令人困惑。
  • +1 在任何地方都使用$(CC),而不是有时使用 var 有时使用文字字符串。
  • @Benny 你有没有在适当的地方(在命令的开头)将空格固定回选项卡?
  • 是的,这里的 Markdown 不保留标签。 Makefile 中的缩进(例如,用于构建目标的命令)必须使用制表符。
  • 我认为$(LIBS)应该放在命令的end处。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多