SFML 的链接器错误

Linker error with SFML

当 运行 g++ -lsfml-window -lsfml-graphics -lsfml-system main.cpp 示例 SFML 代码、运行 Ubuntu、SFML 2.2 和 g++ 4.8.2 时,我得到了一系列错误。我已经尝试从包管理器 (libsfml-dev) 重新安装 SFML,但没有任何效果。

示例 SFML 代码:

#include <SFML/Graphics.hpp>
#include <string>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen())
    {
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
    }

    window.clear();
    window.draw(shape);
    window.display();
    }

    return 0;
}

错误信息:

/tmp/ccVG6GjG.o: In function `main':
main.cpp:(.text+0xf7): undefined reference to `sf::String::String(char const*, std::locale const&)'
main.cpp:(.text+0x115): undefined reference to `sf::VideoMode::VideoMode(unsigned int, unsigned int, unsigned int)'
main.cpp:(.text+0x148): undefined reference to `sf::RenderWindow::RenderWindow(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings cons'
main.cpp:(.text+0x182): undefined reference to `sf::CircleShape::CircleShape(float, unsigned int)'
main.cpp:(.text+0x18e): undefined reference to `sf::Color::Green'
main.cpp:(.text+0x196): undefined reference to `sf::Shape::setFillColor(sf::Color const&)'
main.cpp:(.text+0x1b6): undefined reference to `sf::Window::close()'
main.cpp:(.text+0x1cf): undefined reference to `sf::Window::pollEvent(sf::Event&)'
main.cpp:(.text+0x1f7): undefined reference to `sf::Color::Color(unsigned char, unsigned char, unsigned char, unsigned char)'
main.cpp:(.text+0x214): undefined reference to `sf::RenderTarget::clear(sf::Color const&)'
main.cpp:(.text+0x22b): undefined reference to `sf::RenderStates::Default'
main.cpp:(.text+0x236): undefined reference to `sf::RenderTarget::draw(sf::Drawable const&, sf::RenderStates const&)'
main.cpp:(.text+0x245): undefined reference to `sf::Window::display()'
main.cpp:(.text+0x254): undefined reference to `sf::Window::isOpen() const'
main.cpp:(.text+0x27f): undefined reference to `sf::RenderWindow::~RenderWindow()'
main.cpp:(.text+0x2a9): undefined reference to `sf::RenderWindow::~RenderWindow()'
main.cpp:(.text+0x2ee): undefined reference to `sf::RenderWindow::~RenderWindow()'
/tmp/ccVG6GjG.o: In function `sf::CircleShape::~CircleShape()':
main.cpp:(.text._ZN2sf11CircleShapeD2Ev[_ZN2sf11CircleShapeD5Ev]+0x13): undefined reference to `vtable for sf::CircleShape'
main.cpp:(.text._ZN2sf11CircleShapeD2Ev[_ZN2sf11CircleShapeD5Ev]+0x1f): undefined reference to `vtable for sf::CircleShape'
main.cpp:(.text._ZN2sf11CircleShapeD2Ev[_ZN2sf11CircleShapeD5Ev]+0x2b): undefined reference to `sf::Shape::~Shape()'
collect2: error: ld returned 1 exit status

有两种方法可以解决这个问题。第一个是交换一些选项,所以命令是这样的:g++ main.cpp -lsfml-window -lsfml-graphics -lsfml-system。第二个选项是尝试将g++更新到4.9.2版本,这可以在ubuntu by doing this

上实现

clang++-3.6(包 clang-3.6 基于 LLVM)对我有用并且是包 repo 的一部分。 g++-4.8.2 也不适用于重新排序库。

您缺少 GCC 的编译命令 g++ -c。 这会给你一个默认的目标文件,然后你可以从终端 运行 。 如果有帮助,我始终有效的标准脚本将是 program => files => includes/libraries => object => Linker files

所以在这种情况下的一个例子是
控制台:g++ -c main.cpp -o sfmlApp -lsfml-window -lsfml-graphics -lsfml-system
控制台:./sfmlApp

其中 -c 是编译,-o 命名默认目标文件。

如果您在大多数 Linux 发行版上使用 libsfml-dev,您可能必须将包含文件和库文件附加到编译和对象实例中。本教程将其显示为添加:
控制台:g++ -c main.cpp -o sfmlApp -L /sfml-install-path/lib -lsfml-graphics -lsfml-window -lsfml-system

其中 -L /sfml-install-path/lib 是网站上 Linux 版本的字面下载位置。如果我记得的话,这应该适用于 Ubuntu,但您可能需要再添加一个步骤,如网站教程中所示,以增加开销才能开始。

export LD_LIBRARY_PATH=/sfml-install-path/lib && ./sfml-app
g++ -c main.cpp -o sfmlApp -lsfml-window -lsfml-graphics -lsfml-system

这至少能让你入门。

解决方法很简单。您没有以正确的顺序传递参数。

正确的顺序

g++  -lsfml-graphics  -lsfml-system -lsfml-system main.cpp

您需要始终以正确的顺序传递参数。

Graphics
Window
Audio
Network
System