close
Skip to content

CMake SFML project can't find references when static linking libFLAC.a #2289

@vis4rd

Description

@vis4rd

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)?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions