【问题标题】:'linker input file unused because linking not done' error when running make'链接器输入文件未使用,因为链接未完成'运行make时出错
【发布时间】:2020-08-20 22:13:29
【问题描述】:

我正在编译我为一个项目编写的 C 程序。

目标

编译get_next_line.cget_next_line_utils.c

结构

我的文件夹中有 3 个文件,get_next_line.cget_next_line_utils.cget_next_line.h(不包括 Makefile)。不多也不少。

代码

NAME = get_next_line

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

CC =        gcc
CFLAGS =    -Wall -Wextra -Werror
LIB_CRT =   ar rcs


all: $(NAME)

$(NAME) : $(OBJS)
    @$(LIB_CRT) $(NAME) $(OBJS)

%.o: %.c $(INCLUDE)
    @$(CC) -c $(CFLAGS) -o $@ $<
clean:
    @rm -f $(OBJS) a.out
fclean: clean
    @rm -f $(NAME)

re : fclean all

错误信息

linker input file unused because linking not done。我多次收到此错误。

当我运行 make 时,我继续运行这个错误。我遵循了另一个项目的另一个 Makefile,但无济于事。我还阅读了 this 文章和 that 一篇文章,但它们与我的问题无关。

任何意见表示赞赏。

【问题讨论】:

  • 我下载了您的 makefile 并使用 touch 创建了空的 .c 文件。我得到 no 错误。但是,我注意到您正在尝试创建一个静态库(通常以.a 结尾),但您的目标是没有.a 后缀的文件。 file 命令表示输出 isar 存档,但是 !?!?删除 @ 前缀可能会有所帮助,这样您就可以看到正在执行的命令。

标签: c gcc makefile linker


【解决方案1】:

您的 makefile 似乎旨在构建一个名为“get_next_line”的程序,但这并不完全清楚,因为您实际上构建的是一个静态存档文件(非常规存档)姓名。这就是ar 实用程序的作用。使用 gcc 工具链和许多其他工具链,通常会使用相同的前端(在这种情况下为 gcc)进行编译和链接。也就是说,

$(NAME) : $(OBJS)
    $(CC) -o $(NAME) $(OBJS)

...或者,有点干...

$(NAME) : $(OBJS)
    $(CC) -o $@ $^

尚不清楚您为什么会收到您报告的特定消息。它看起来像是来自链接器ld 的消息,但我认为在呈现的生成文件中没有理由认为链接器会运行。因此,我倾向于假设该消息与完全不同的事物相关联。可能您在不同的工作目录中运行make,因此使用不同的makefile。或者它可能与make 本身以外的其他命令相关联。或者,也许您在您的环境中设置了一个有影响力的变量,它改变了您的 makefile 的含义。当您尝试像运行程序一样运行存档时,您可能会收到该消息(尽管在这种情况下我不希望发生这种情况)。

【讨论】:

  • 我解决了这个问题。我从$(CC) -c $(CFLAGS) -o $@ $^ 中删除了-c 并修复了根本问题。看起来我有重复的文件,名为 get_next_line_bonusget_next_line_bonus 与我忘记删除的完全相同的代码。我还修复了存档名称。您还提到在我正在做的不同工作目录中运行 make 。这都是固定的
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
相关资源
最近更新 更多