我正在尝试编译 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++ 编译器进行编译。
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,这并不复杂。
我在 Windows 上使用 Clang + SFML 时遇到了同样的问题。解决方案只是重建静态 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