You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MinGW-w64环境下CMake链接SFML静态库失败问题求助

MinGW-w64下SFML静态链接配置错误解决

问题背景

在Windows系统使用MinGW-w64(gcc、g++20)开发项目,尝试链接SFML库:

  • 先下载Win64预编译SFML,编译出错;
  • 参照视频手动编译SFML后,CMake配置时出现错误:找到C:/SFML/lib/cmake/SFML/SFMLConfig.cmake文件,但该文件将SFML_FOUND设为FALSE,提示请求的SFML静态配置未找到。

CMakeLists.txt内容

#--------------------------- MAIN CONFIGURATION ---------------------------#

cmake_minimum_required(VERSION 3.17.0)

project(black_penny)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines -IC:/SFML/include")
set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc")
set(SFML_STATIC_LIBRARIES TRUE)

set(
MAIN_SRC
main.cpp
)

add_executable(
$CACHE{CMAKE_PROJECT_NAME}
${MAIN_SRC}
)

#----------------------------- LINK LIBRARIES -----------------------------#

# Adding Boost library;

find_package(Boost REQUIRED)

message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}")
message(STATUS "Boost_VERSION: ${Boost_VERSION}")
message(STATUS "BOOST_SYSTEM: ${BOOST_SYSTEM}")
message(STATUS "BOOST_FILE_SYSTEM: ${BOOST_FILE_SYSTEM}")

include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries($CACHE{CMAKE_PROJECT_NAME} LINK_PUBLIC ${Boost_LIBRARIES})

# if windows compiler;

if(MINGW)
message(STATUS "MinGW compiler defined!")
SET(
WIN_LIBS
ws2_32
wsock32
)
target_link_libraries($CACHE{CMAKE_PROJECT_NAME} ${WIN_LIBS})
endif()

add_subdirectory(tests)

# add SFML library;

set(SFML_DIR "C:/SFML/lib/cmake/SFML")
find_package(SFML REQUIRED system window graphics network audio)

if (SFML_FOUND)
message(STATUS "SFML was FOUND!")
#find_package(SFML REQUIRED graphics network audio window system)
#set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
target_link_libraries(${EXECUTABLE_NAME} sfml-graphics)
else()
message(STATUS "SFML was NOT FOUND")
endif()

CMake输出信息

-- Boost_INCLUDE_DIRS: C:/MinGW/include
-- Boost_LIBRARIES:
-- Boost_VERSION: 1.81.0
-- BOOST_SYSTEM:
-- BOOST_FILE_SYSTEM:
-- MinGW compiler defined!
CMake Error at C:/SFML/lib/cmake/SFML/SFMLConfig.cmake:139 (message):
Requested SFML configuration (Static) was not found
Call Stack (most recent call first):
CMakeLists.txt:54 (find_package)

CMake Error at CMakeLists.txt:54 (find_package):
Found package configuration file:

    C:/SFML/lib/cmake/SFML/SFMLConfig.cmake

but it set SFML_FOUND to FALSE so package "SFML" is considered to be NOT
FOUND.

-- Configuring incomplete, errors occurred!
See also "C:/Users/Nikita/Documents/Project/Messanger/BlackPenny/build/CMakeFiles/CMakeOutput.log".
make: *** [Makefile:192: cmake_check_build_system] Error 1

解决步骤

  1. 确认手动编译SFML时的静态库选项
    重新运行CMake配置SFML时,必须开启BUILD_STATIC_LIBS选项(CMake-GUI中勾选,命令行则添加-DBUILD_STATIC_LIBS=ON),否则编译出的只有动态库,无法满足静态链接需求。编译完成后重新安装SFML。

  2. 修正CMakeLists.txt中的配置问题

    • 确保set(SFML_STATIC_LIBRARIES TRUE)放在find_package(SFML ...)之前;
    • 替换未定义的${EXECUTABLE_NAME}为项目实际可执行目标名(比如$CACHE{CMAKE_PROJECT_NAME}或${PROJECT_NAME});
    • 静态链接时需显式链接所有依赖的SFML模块及系统依赖库。

    修正后的SFML配置片段:

    # 放在find_package前设置静态链接
    set(SFML_STATIC_LIBRARIES TRUE)
    set(SFML_DIR "C:/SFML/lib/cmake/SFML")
    find_package(SFML REQUIRED system window graphics network audio)
    
    if (SFML_FOUND)
        message(STATUS "SFML was FOUND!")
        target_link_libraries($CACHE{CMAKE_PROJECT_NAME} sfml-graphics sfml-window sfml-system sfml-network sfml-audio)
    else()
        message(STATUS "SFML was NOT FOUND")
    endif()
    
  3. 匹配MinGW版本
    确保编译SFML使用的MinGW-w64版本(包括32/64位、线程模型、异常处理模型)与项目编译所用版本完全一致,版本不匹配会导致静态库无法被CMake识别。

内容的提问来源于stack exchange,提问作者Nikita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:10:16