【问题标题】:Makefile - linker input file unused because linking not doneMakefile - 链接器输入文件未使用,因为链接未完成
【发布时间】:2021-01-17 00:01:39
【问题描述】:

我的 Makefile 有一个问题,如果出现我不理解的错误,该问题将无法正常工作。

这是错误:

g++ -ISFML/include -c src/gameManager/component.cpp -o obj/Component.o -lsfml-graphics -lsfml-window -lsfml-system -lsfml-main
g++ -ISFML/include -c src/gameManager/gameManager.cpp -o obj/GameManager.o -g obj/Component.o -lsfml-graphics -lsfml-window -lsfml-system -lsfml-main
g++: warning: obj/Component.o: linker input file unused because linking not done
g++ -ISFML/include -c src/main.cpp -o obj/main.o obj/GameManager.o
g++: warning: obj/GameManager.o: linker input file unused because linking not done
g++ -LSFML/lib -o bin/main.exe -g obj/main.o obj/GameManager.o -lsfml-graphics -lsfml-window -lsfml-system -lsfml-main
/usr/bin/ld : ne peut trouver -lsfml-graphics
/usr/bin/ld : ne peut trouver -lsfml-window
/usr/bin/ld : ne peut trouver -lsfml-system
/usr/bin/ld : ne peut trouver -lsfml-main
collect2: error: ld returned 1 exit status
Makefile:14: recipe for target 'all' failed
make: *** [all] Error 1

这是 Makefile :

INCLUDE = -ISFML/include
LIB = -LSFML/lib
LINK_SFML = -lsfml-graphics -lsfml-window -lsfml-system -lsfml-main

ifeq ($(OS),Windows_NT)
    LINKER_FLAGS = -lmingw32 $(LINK_SFML)
else
    LINKER_FLAGS = $(LINK_SFML)
endif

all : GameManager.o
    g++ $(INCLUDE) -c src/main.cpp -o obj/main.o obj/GameManager.o
    g++ $(LIB) -o bin/main.exe -g obj/main.o obj/GameManager.o $(LINKER_FLAGS)

GameManager.o : Component.o
    g++ $(INCLUDE) -c src/gameManager/gameManager.cpp -o obj/GameManager.o -g obj/Component.o $(LINKER_FLAGS)

Component.o :
    g++ $(INCLUDE) -c src/gameManager/component.cpp -o obj/Component.o $(LINKER_FLAGS)

注意:它适用于 W10,但不适用于 Ubuntu Linux。

提前谢谢你。

【问题讨论】:

  • 您使用的机器上是否安装了 SFML?顺便说一句,未使用的链接器文件上的警告与链接失败无关。提醒一下,当您使用 -c 编译时,无需将链接器标志传递给 g++(这意味着:不要进行链接)。
  • -c 标志告诉g++ 创建目标文件,而不是链接。并且编译成目标文件时,其他目标文件不能作为输入。
  • 关于 linker input file unused 消息,尽管您指定了 -c,但您将 $(LINKER_FLAGS) 传递给编译器事件,这意味着“仅编译 -- 不链接”。
  • 根据您的链接器命令g++ -LSFML/lib ...-lsfml-graphics ...,库libsfml-graphics 应该位于SFML/lib 或任何系统库目录中。你的 Linux 系统上的库在哪里?请edit你的问题补充信息,不要用cmets来回答。

标签: c++ linux gcc makefile


【解决方案1】:

您的构建配置似乎与平台无关,并且您的 Ubuntu 上没有安装 sfml 库。

要解决这个问题,请通过以下命令安装sfml

sudo apt install libsfml-dev

现在从LINK_SFML 变量中删除-lsfml-main,因为它仅适用于Windows。如果平台是这样的Windows,则将-lsfml-main添加到LINKER_FLAGS

ifeq ($(OS),Windows_NT)
    LINKER_FLAGS = -lmingw32 -lsfml-main $(LINK_SFML)
else
    LINKER_FLAGS = $(LINK_SFML)
endif

您的代码现在应该可以编译了,警告仍然会出现。要删除警告,请从编译命令中删除链接器选项。此外,在 Linux 上,库和头文件通常在系统目录中可用。所以你不需要LIBINCLUDE 变量。所以,而不是这个:

INCLUDE = -ISFML/include
LIB = -LSFML/lib

使用这个:

ifeq ($(OS),Windows_NT)
    INCLUDE = -ISFML/include
    LIB = -LSFML/lib
endif

您的Makefile 现在应该可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多