使用Git子模块时ImGui-SFML的CMake编译错误求助
解决SFML+ImGui-SFML编译时枚举未找到问题
问题背景
通过Git子模块引入SFML、ImGui和ImGui-SFML到项目中,编译时ImGui-SFML模块报错,无法找到SFML的部分枚举类型(如sf::Joystick::X、sf::Cursor::Arrow等)。
项目结构
. ├── CMakeLists.txt ├── build ├── include ├── libs │ ├── SFML │ ├── imgui │ └── imgui-sfml ├── src └── tests
原CMake配置
cmake_minimum_required(VERSION 3.21) project(app) set(CMAKE_CXX_STANDARD 17) set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") set(INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") set(TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests") set(LIBS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libs") set(SFML_DIR "${LIBS_DIR}/SFML") set(IMGUI_DIR "${LIBS_DIR}/imgui") set(IMGUI_SFML_DIR "${LIBS_DIR}/imgui-sfml") file(GLOB_RECURSE COMMON_SOURCES "${SOURCE_DIR}/*.cpp" "${TEST_DIR}/*.cpp") list(REMOVE_ITEM COMMON_SOURCES "${SOURCE_DIR}/main.cpp" "${TEST_DIR}/main.cpp") file(GLOB_RECURSE SFML_HEADERS "${SFML_DIR}/include/*.hpp") add_subdirectory(${LIBS_DIR}/sfml) set(IMGUI_SFML_FIND_SFML OFF) set(IMGUI_SFML_IMGUI_DEMO ON) add_subdirectory(${IMGUI_SFML_DIR}) macro(create_target target sources) add_executable(${target} ${sources}) target_sources(${target} PRIVATE ${COMMON_SOURCES}) target_link_libraries(${target} PRIVATE sfml-system sfml-window sfml-graphics ImGui-SFML::ImGui-SFML) target_include_directories(${target} PRIVATE ${LIBS_DIR} ${INCLUDE_DIR} ${SFML_DIR}/include ${IMGUI_DIR} ${IMGUI_SFML_DIR}) endmacro() create_target(app ${SOURCE_DIR}/main.cpp) create_target(test ${TEST_DIR}/main.cpp)
编译错误示例
10%] Built target sfml-system [ 45%] Built target sfml-window [ 68%] Built target sfml-graphics [ 68%] Building CXX object libs/imgui-sfml/CMakeFiles/ImGui-SFML.dir/imgui-SFML.cpp.o /Users/loicpottier/Documents/GitHub/projet_recherche/libs/imgui-sfml/imgui-SFML.cpp:172:31: error: no member named 'X' in namespace 'sf::Joystick' xAxis = sf::Joystick::X; ~~~~~~~~~~~~~~^ /Users/loicpottier/Documents/GitHub/projet_recherche/libs/imgui-sfml/imgui-SFML.cpp:173:31: error: no member named 'Y' in namespace 'sf::Joystick' yAxis = sf::Joystick::Y; ~~~~~~~~~~~~~~^ /Users/loicpottier/Documents/GitHub/projet_recherche/libs/imgui-sfml/imgui-SFML.cpp:185:30: error: no member named 'Z' in namespace 'sf::Joystick' axis = sf::Joystick::Z; ~~~~~~~~~~~~~~^ /Users/loicpottier/Documents/GitHub/projet_recherche/libs/imgui-sfml/imgui-SFML.cpp:303:57: error: no member named 'Arrow' in 'sf::Cursor' loadMouseCursor(ImGuiMouseCursor_Arrow, sf::Cursor::Arrow); ~~~~~~~~~~~~^ /Users/loicpottier/Documents/GitHub/projet_recherche/libs/imgui-sfml/imgui-SFML.cpp:304:61: error: no member named 'Text' in 'sf::Cursor' loadMouseCursor(ImGuiMouseCursor_TextInput, sf::Cursor::Text); ~~~~~~~~~~~~^ /Users/loicpottier/Documents/GitHub/projet_recherche/libs/imgui-sfml/imgui-SFML.cpp:305:61: error: no member named 'SizeAll' in 'sf::Cursor' loadMouseCursor(ImGuiMouseCursor_ResizeAll, sf::Cursor::SizeAll); ~~~~~~~~~~~~^
解决方案
1. 版本不匹配是核心问题
报错里的枚举写法是SFML 2.x的旧命名规则,比如SFML 3.x中sf::Joystick::X已改为sf::Joystick::Axis::X,sf::Cursor::Arrow改为sf::Cursor::Type::Arrow。这说明你使用的ImGui-SFML版本与SFML版本不兼容:
- 若使用SFML 3.x:需要切换到ImGui-SFML的
sfml3分支(该分支专门适配SFML 3.x) - 若使用SFML 2.6.x及以下:使用ImGui-SFML的
master分支或对应2.x的发布版本
2. 修正CMake配置的依赖传递
原配置中手动添加SFML头文件路径且未正确传递依赖,导致ImGui-SFML编译时无法获取SFML的正确编译上下文。修改后的CMake关键部分如下:
cmake_minimum_required(VERSION 3.21) project(app) set(CMAKE_CXX_STANDARD 17) set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") set(INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") set(TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests") set(LIBS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libs") set(SFML_DIR "${LIBS_DIR}/SFML") set(IMGUI_DIR "${LIBS_DIR}/imgui") set(IMGUI_SFML_DIR "${LIBS_DIR}/imgui-sfml") file(GLOB_RECURSE COMMON_SOURCES "${SOURCE_DIR}/*.cpp" "${TEST_DIR}/*.cpp") list(REMOVE_ITEM COMMON_SOURCES "${SOURCE_DIR}/main.cpp" "${TEST_DIR}/main.cpp") # 先编译SFML,确保目标被正确注册 add_subdirectory(${SFML_DIR}) # 配置ImGui-SFML:禁用自动查找SFML,使用本地编译的版本 set(IMGUI_SFML_FIND_SFML OFF) set(IMGUI_SFML_IMGUI_DEMO ON) # 手动指定ImGui源码目录 set(IMGUI_DIR ${IMGUI_DIR}) add_subdirectory(${IMGUI_SFML_DIR}) macro(create_target target sources) add_executable(${target} ${sources}) target_sources(${target} PRIVATE ${COMMON_SOURCES}) # 仅链接ImGui-SFML,它会自动传递依赖的SFML目标 target_link_libraries(${target} PRIVATE ImGui-SFML::ImGui-SFML) # 仅添加项目自身的头文件目录,依赖库的头文件由目标自动传递 target_include_directories(${target} PRIVATE ${INCLUDE_DIR}) endmacro() create_target(app ${SOURCE_DIR}/main.cpp) create_target(test ${TEST_DIR}/main.cpp)
3. 额外检查步骤
- 确认子模块版本:进入
libs/SFML和libs/imgui-sfml目录,用git checkout切换到匹配的分支/标签 - 清理缓存:删除整个
build目录,重新运行cmake ..和编译命令,避免旧缓存干扰
内容的提问来源于stack exchange,提问作者Loïc Pottier
相关产品推荐
相关产品推荐

