【问题标题】:What does “linker input file unused because linking not done” mean?“链接器输入文件未使用,因为链接未完成”是什么意思?
【发布时间】:2019-01-20 16:23:37
【问题描述】:

这很奇怪。尽管一切都按预期工作,但编译器会抛出此警告。

这是引发警告的生成文件:

TARGET = $(notdir $(shell pwd))

LIBS = -lm -lev3dev-c
D_BIN = Build-Assets

ifeq ($(OS),Windows_NT)
LIBS := $(LIBS) -lws2_32
D_BIN := $(D_BIN)/mingw
endif

D_H = ../../source/ev3
CFLAGS = $(addprefix -I, $(D_H)) -O2 -std=gnu99 -W -Wall -Wno-comment

ifeq ($(OS),Windows_NT)
CC = gcc
else
CC = arm-linux-gnueabi-gcc
endif

ifeq ($(OS),Windows_NT)
E_BIN = .exe
else
E_BIN =
endif

F_BIN = $(TARGET)$(E_BIN)

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard MotorControl/*.c)))

.PHONY: default all clean

default: $(F_BIN)
all: default

$(OBJECTS): $(D_BIN)/%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(F_BIN) $(OBJECTS)

$(F_BIN): $(OBJECTS)
    $(CC) $(OBJECTS) -c -Wall $(LIBS) -o $@

clean:
    -rm -f $(D_BIN)/*.o
    -rm -f $(F_BIN)

我应该补充一点,我不知道自己在做什么......我刚开始使用 C,那些该死的 makefile 非常强大。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    -c option 跳过最后的链接并生成一个可重定位的目标文件:

    $(F_BIN): $(OBJECTS)
        $(CC) $(OBJECTS) -c -Wall $(LIBS) -o $@
    

    这就是为什么在这个阶段不使用链接器输入文件的原因。您应该能够删除-c 选项,该命令将生成一个可执行文件。

    【讨论】:

    • 如果我删除选项 -c 编译失败,因为它找不到 main()... 我应该补充一点,帖子中的 makefile 应该编译一种“库”,即我在其他地方使用(虽然其他地方确实有 main)。
    • @A.Dandelion:共享库还是静态库?
    • @Beta 我真的不知道。基本上我编译这个.c文件,并在主.c文件的编译步骤中链接这个相同文件的.o。我不知道那是静态/共享还是图书馆。
    • 如果它没有main,你打算如何使用它?库包含供其他程序使用的函数;一个可自行运行的程序需要有一个main 函数,这样操作系统才能知道它的入口点。
    • @A.Dandelion:你是说这真的有效吗?如果是这样,您的编译器必须与我的不同。猜测一下,我会说你正在创建一个大目标文件,它就像一个静态库,但更笨重。
    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多