【问题标题】:undefined reference when using SFML使用 SFML 时未定义的引用
【发布时间】:2018-01-21 13:51:57
【问题描述】:

我正在尝试使用 SFML 库编译程序

我的来源是这样的:

//main.cpp
#include <SFML/Graphics.hpp>
int main(){
    sf::Color c;
}

我是这样编译的
g++ -IC:/dev/include -c main.cpp
并像这样链接
g++ -LC:/dev/lib -lsfml-system -lsfml-window -lsfml-graphics -lsfml-audio -lsfml-network main.o -o main.exe

链接时出现此错误:
main.o:main.cpp:(.text+0x1e): undefined reference to '__imp__ZN2sf5ColorC1Ev'

我做错了什么?
我自己使用 gcc 6.1 和 cmake 编译了 SFML 二进制文件

【问题讨论】:

  • 为什么不使用预制的 SFML 库?
  • 我试过了,但它给了我同样的错误。然后我从源代码构建它,希望能修复它
  • 需要检查的几件事 - 在属性中,确保您使用的是 Active(Win32),您的文件夹:[游戏名称] -> [游戏名称] 包含所有 .dll 文件
  • 什么属性?
  • 你在用 Visual Studio 吗?

标签: c++ gcc compiler-errors linker sfml


【解决方案1】:

尝试像这样编写你的命令,指定库输入之后:

g++ -o main.exe main.o -LC:/dev/lib -lsfml-system -lsfml-window -lsfml-graphics -lsfml-audio -lsfml-network

链接参数的顺序很重要,因为链接器将按顺序进行输入。对于每个项目,它将用从当前项目导出的符号填充现有的未定义符号列表,然后用当前项目中未定义的符号填充该列表。因此,当main.o 是未定义符号的最后一个列表时,包含main.o 所需的所有内容,但没有更多项目(库)来填充那些缺失的符号。请注意,这意味着库的顺序也很重要,因此应该将更多“通用”库保持在靠近列表末尾的位置。

【讨论】:

  • 感谢帮助。你能告诉我这是为什么吗?
  • @KnutZuidema 链接参数的顺序很重要,因为它将按顺序进行输入。对于每个项目,它将用从当前项目导出的符号填充现有的未定义符号列表,然后用当前项目中未定义的符号填充该列表。因此,当main.o 是未定义符号的最后一个列表时,包含main.o 所需的所有内容,但没有更多项目(库)来填补这些空白。请注意,这意味着库的顺序也很重要,因此应将更多“通用”库放在更靠近列表末尾的位置。
  • 非常感谢您的解释。
最近更新 更多