SFML 未定义对“std::basic_streambuf...”的引用

SFML undefined reference to `std::basic_streambuf...'

提问人:elanilero 提问时间:8/7/2022 最后编辑:273Kelanilero 更新时间:11/12/2023 访问量:601

问:

我正在尝试编译SFML示例程序:

#define SFML_STATIC 

#include <iostream>
#include <SFML-2.5.1\\include\\SFML\\Window.hpp>

using namespace std;

namespace SF = sf;

int main()
{
    SF::Window window {SF::VideoMode{600, 600}, "Test1"};

    while(window.isOpen())
    {
        SF::Event event;

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

    }

    return 0;
}

首先,我编译

g++ -c main.cpp -IH:\CPPLIBS\SFML-2.5.1\include -DSFML_STATIC

然后我链接

g++ main.o -o main -LH:\CPPLIBS\SFML-2.5.1\lib -lsfml-graphics-s -lsfml-window-s -lsfml-system-s -lopengl32 -lwinmm -lgdi32

但是在链接阶段,我收到错误

H:\CPPLIBS\SFML-2.5.1\lib/libsfml-system-s.a(Err.cpp.obj):Err.cpp:(.rdata+0x80):
undefined reference to `std::basic_streambuf<char, std::char_traits<char>>::seekpos(std::fpos<int>, std::_Ios_Openmode)'

我几乎在网上搜索了到处的解决方案,并试图自己修复它,更改库顺序,使用单个命令编译和链接并更改参数,但我真的无法修复它,似乎没有人遇到过这个确切的问题。 如您所见,我使用的是 WinLibs Mingw 附带的 g++ 编译器进行编译。

C G++ mingw 链接器错误 SFML

评论

0赞 273K 8/7/2022
您的编译器似乎与 SFML 不匹配。你读过红 sfml-dev.org/tutorials/2.5/start-cb.php#installing-sfmlsfml-dev.org/download/sfml/2.5.1 吗?
0赞 elanilero 8/7/2022
我没有读第二个,因为正如你所看到的,我没有使用 CodeBlocks,关于第一个:我把它涂红了,但在 stackoverflow 上发现有人说“指示的编译器版本和编译器版本必须匹配”并不是真正的强制性,他们完全可以在更现代的版本上编译 SFML,并且指示的版本太旧了,而且不必要的旧。
0赞 273K 8/7/2022
所以,你遇到了构建问题,你仍然对 SO 帖子有自己的意见,这与官方手册相反。这两个链接都是关于mingw的,为什么你在那里只看到代码块。
0赞 elanilero 8/7/2022
如果它对他们有用,我不明白为什么它不应该对其他人有用,而且使用这样的旧版本似乎不是最好的选择,所以,如果它在那里,我想知道一种将它与现代编译器版本一起使用的方法。
1赞 James 11/7/2022
idk 如果这会有所帮助,但每当我想使用字体时,我也做过这样的噩梦,我想我的知识存在许多空白。显然,您需要 winlibs 的 msvcrt 版本,而不是 ucrt 版本,如果这是您拥有的版本,这可能会有所帮助。一旦我设置了 msvcrt 版本,我仍然在构建我的项目时遇到问题,所以我从字面上开始使用 sfml 重新开始,用我的编译器设置再次构建它,它们现在的样子,仍然存在问题,所以我重新开始,这次也使用我刚刚解压缩的新 SFML......它现在似乎正在工作!即使在使用字体时!

答:

0赞 273K 8/7/2022 #1

GCC 12 中的默认 C++ 方言是 .尝试以下命令-std=gnu++17

g++ -std=gnu++11 -c main.cpp -IH:\CPPLIBS\SFML-2.5.1\include -DSFML_STATIC

g++ -std=gnu++11 main.o -o main -LH:\CPPLIBS\SFML-2.5.1\lib -lsfml-graphics-s -lsfml-window-s -lsfml-system-s -lopengl32 -lwinmm -lgdi32

如果它没有帮助,请参阅我对问题的评论。您可能需要从源构建 SFML。

如果你觉得你的GCC版本不能与预编译的SFML库一起使用,不要犹豫,自己构建SFML,这并不复杂。

评论

0赞 elanilero 8/7/2022
如果我从源代码构建它,我将能够将它与我想要的任何编译器版本一起使用?顺便说一句:我的命令也遇到了同样的错误
0赞 273K 8/7/2022
将能够将它与我想要的任何编译器版本一起使用不可以,您将无法将其与任何编译器一起使用。您将能够使用用于 SFML 构建的编译器版本进行构建。
0赞 elanilero 8/7/2022
这就是我的意思,谢谢,我会努力的。我是现在必须接受您的回答,还是在编译 SFML 后必须等待编译成功?
0赞 273K 8/7/2022
这取决于你。答案并没有按照你想要的方式解决问题。
0赞 elanilero 8/7/2022
我尝试按照官方教程构建库,但在“构建 CXX 对象...”我得到了两个“对_setjmp的未定义引用”。
0赞 user1314464 11/12/2023 #2

我在使用 Clang + SFML for Windows 时遇到了同样的问题。解决方案是使用以下命令重建静态 SFML 库:

Cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DSFML_USE_STATIC_STD_LIBS=ON -DBUILD_SHARED_LIBS=OFF -B build -G "Ninja"

ninja -C build