Subject of the issue
When linking SFML statically, there are undefined references to libFLAC.a symbols (detailed CMakeLists.txt below).
Your environment
OS: Windows 11 Home 22H2 build 22621.819
SFML version: git master
Compiler: MinGW 10.0 GCC 12.1.0 (x86_64-w64-mingw32)
Reproducible example
Structure
_ bin/
_ build/
_ lib/
___ SFML/ # fetched as git submodule
_ CMakeLists.txt
_ main.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
set(EXECUTABLE_NAME "main")
project(SFML_REPRO)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin")
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(SFML_USE_STATIC_STD_LIBS ON CACHE BOOL "" FORCE)
set(SFML_BUILD_WINDOW OFF CACHE BOOL "" FORCE)
set(SFML_BUILD_GRAPHICS OFF CACHE BOOL "" FORCE)
set(SFML_BUILD_AUDIO ON CACHE BOOL "" FORCE)
set(SFML_BUILD_NETWORK OFF CACHE BOOL "" FORCE)
set(SFML_BUILD_DOC OFF CACHE BOOL "" FORCE)
set(SFML_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(SFML_BUILD_TEST_SUITE OFF CACHE BOOL "" FORCE)
set(SFML_ENABLE_COVERAGE OFF CACHE BOOL "" FORCE)
set(SFML_INSTALL_PKGCONFIG_FILES OFF CACHE BOOL "" FORCE)
set(SFML_ENABLE_PCH ON CACHE BOOL "" FORCE)
set(SFML_USE_SYSTEM_DEPS OFF CACHE BOOL "" FORCE)
set(SFML_BUILD_FRAMEWORKS OFF CACHE BOOL "" FORCE)
set(SFML_STATIC_LIBRARIES ON CACHE BOOL "" FORCE)
add_subdirectory("${PROJECT_SOURCE_DIR}/lib/SFML")
add_executable(${EXECUTABLE_NAME})
target_sources(${EXECUTABLE_NAME}
PRIVATE main.cpp)
target_compile_features(${EXECUTABLE_NAME}
PRIVATE "cxx_std_20")
target_link_libraries(${EXECUTABLE_NAME}
PRIVATE sfml-system sfml-audio) # not sure if sfml-system target is necessary here?
main.cpp
#include <SFML/Audio.hpp>
int main()
{
sf::SoundBuffer buffer;
sf::Sound sound;
sound.setBuffer(buffer);
return 0;
}
Expected behavior
Correct compilation and linking
Actual behavior
[main] Building folder: sfml_repro
[build] Starting build
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --build d:/Shared/Code/CPP/sfml_repro/build --config Release --target all -j 14 --
[build] -- Configuring done
[build] -- Generating done
[build] -- Build files have been written to: D:/Shared/Code/CPP/sfml_repro/build
[build] [ 2%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/cmake_pch.hxx.gch
[build] [ 5%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/Clock.cpp.obj
[build] [ 10%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/Sleep.cpp.obj
[build] [ 10%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/Err.cpp.obj
[build] [ 13%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/String.cpp.obj
[build] [ 18%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/Vector3.cpp.obj
[build] [ 21%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/Vector2.cpp.obj
[build] [ 21%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/FileInputStream.cpp.obj
[build] [ 24%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/MemoryInputStream.cpp.obj
[build] [ 27%] Building CXX object lib/SFML/src/SFML/System/CMakeFiles/sfml-system.dir/Win32/SleepImpl.cpp.obj
[build] [ 29%] Linking CXX static library ..\..\..\lib\libsfml-system-s.a
[build] [ 29%] Built target sfml-system
[build] [ 32%] Building CXX object lib/SFML/src/SFML/Main/CMakeFiles/sfml-main.dir/MainWin32.cpp.obj
[build] [ 35%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/ALCheck.cpp.obj
[build] [ 37%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/AlResource.cpp.obj
[build] [ 40%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/AudioDevice.cpp.obj
[build] [ 43%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/Listener.cpp.obj
[build] [ 45%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/Music.cpp.obj
[build] [ 48%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/Sound.cpp.obj
[build] [ 51%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundBuffer.cpp.obj
[build] [ 54%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundBufferRecorder.cpp.obj
[build] [ 56%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/InputSoundFile.cpp.obj
[build] [ 59%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundRecorder.cpp.obj
[build] [ 62%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundSource.cpp.obj
[build] [ 67%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundStream.cpp.obj
[build] [ 67%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/OutputSoundFile.cpp.obj
[build] [ 70%] Linking CXX static library ..\..\..\lib\libsfml-main.a
[build] [ 75%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundFileFactory.cpp.obj
[build] [ 75%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundFileReaderFlac.cpp.obj
[build] [ 78%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundFileReaderMp3.cpp.obj
[build] [ 81%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundFileReaderOgg.cpp.obj
[build] [ 83%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundFileReaderWav.cpp.obj
[build] [ 83%] Built target sfml-main
[build] [ 86%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundFileWriterFlac.cpp.obj
[build] [ 89%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundFileWriterOgg.cpp.obj
[build] [ 91%] Building CXX object lib/SFML/src/SFML/Audio/CMakeFiles/sfml-audio.dir/SoundFileWriterWav.cpp.obj
[build] [ 94%] Linking CXX static library ..\..\..\lib\libsfml-audio-s.a
[build] [ 94%] Built target sfml-audio
[build] [ 97%] Building CXX object CMakeFiles/main.dir/main.cpp.obj
[build] [100%] Linking CXX executable D:\Shared\Code\CPP\sfml_repro\bin\main.exe
[build] c:/environment/mingw64-10.0.0/bin/../lib/gcc/x86_64-w64-mingw32/12.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/Shared/Code/CPP/sfml_repro/lib/SFML/extlibs/libs-mingw/x64/libFLAC.a(stream_decoder.o):stream_decoder.c:(.text+0x217): undefined reference to `__imp___iob_func'
[build] c:/environment/mingw64-10.0.0/bin/../lib/gcc/x86_64-w64-mingw32/12.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/Shared/Code/CPP/sfml_repro/lib/SFML/extlibs/libs-mingw/x64/libFLAC.a(stream_decoder.o):stream_decoder.c:(.text+0x267): undefined reference to `__imp___iob_func'
[build] c:/environment/mingw64-10.0.0/bin/../lib/gcc/x86_64-w64-mingw32/12.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/Shared/Code/CPP/sfml_repro/lib/SFML/extlibs/libs-mingw/x64/libFLAC.a(stream_decoder.o):stream_decoder.c:(.text+0x2c7): undefined reference to `__imp___iob_func'
[build] c:/environment/mingw64-10.0.0/bin/../lib/gcc/x86_64-w64-mingw32/12.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/Shared/Code/CPP/sfml_repro/lib/SFML/extlibs/libs-mingw/x64/libFLAC.a(stream_decoder.o):stream_decoder.c:(.text+0x532): undefined reference to `__imp___iob_func'
[build] c:/environment/mingw64-10.0.0/bin/../lib/gcc/x86_64-w64-mingw32/12.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/Shared/Code/CPP/sfml_repro/lib/SFML/extlibs/libs-mingw/x64/libFLAC.a(stream_decoder.o):stream_decoder.c:(.text+0x4db2): undefined reference to `__imp___iob_func'
[build] c:/environment/mingw64-10.0.0/bin/../lib/gcc/x86_64-w64-mingw32/12.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/Shared/Code/CPP/sfml_repro/lib/SFML/extlibs/libs-mingw/x64/libFLAC.a(stream_decoder.o):stream_decoder.c:(.text+0x4e03): more undefined references to `__imp___iob_func' follow
[build] collect2.exe: error: ld returned 1 exit status
[build] mingw32-make[2]: *** [CMakeFiles\main.dir\build.make:108: D:/Shared/Code/CPP/sfml_repro/bin/main.exe] Error 1
[build] mingw32-make[1]: *** [CMakeFiles\Makefile2:166: CMakeFiles/main.dir/all] Error 2
[build] mingw32-make: *** [Makefile:155: all] Error 2
[proc] The command: "C:\Program Files\CMake\bin\cmake.EXE" --build d:/Shared/Code/CPP/sfml_repro/build --config Release --target all -j 14 -- exited with code: 2 and signal: null
[build] Build finished with exit code 2
I suspect that built binary of libFLAC.a is not compatible with my compiler/linker. Do I have to build it from source? How can I integrate it with SFML's CMake build system? If this is the actual issue, can future SFML versions allow building its dependencies from sources as well (through i.e. submodules or FetchContent)?
Subject of the issue
When linking SFML statically, there are undefined references to libFLAC.a symbols (detailed
CMakeLists.txtbelow).Your environment
OS: Windows 11 Home 22H2 build 22621.819
SFML version: git master
Compiler: MinGW 10.0 GCC 12.1.0 (x86_64-w64-mingw32)
Reproducible example
Structure
_ bin/ _ build/ _ lib/ ___ SFML/ # fetched as git submodule _ CMakeLists.txt _ main.cppCMakeLists.txtmain.cppExpected behavior
Correct compilation and linking
Actual behavior
I suspect that built binary of
libFLAC.ais not compatible with my compiler/linker. Do I have to build it from source? How can I integrate it with SFML's CMake build system? If this is the actual issue, can future SFML versions allow building its dependencies from sources as well (through i.e. submodules orFetchContent)?