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
解决步骤
确认手动编译SFML时的静态库选项
重新运行CMake配置SFML时,必须开启BUILD_STATIC_LIBS选项(CMake-GUI中勾选,命令行则添加-DBUILD_STATIC_LIBS=ON),否则编译出的只有动态库,无法满足静态链接需求。编译完成后重新安装SFML。修正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()- 确保
匹配MinGW版本
确保编译SFML使用的MinGW-w64版本(包括32/64位、线程模型、异常处理模型)与项目编译所用版本完全一致,版本不匹配会导致静态库无法被CMake识别。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

