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

Mac下用cpack打包的SFML应用无法接收键盘事件怎么办?

macOS下CPack打包SFML应用无法接收键盘事件问题

我在自己fork的SFML CMake项目中,尝试用cpack为macOS创建应用程序包,已成功复制所需的共享库。修改示例代码添加了可通过方向键移动的圆形用于测试,但运行应用程序包时无法接收键盘事件,直接运行包内的二进制文件则一切正常。

我的CMake配置如下:

cmake_minimum_required(VERSION 3.16)
project(CMakeSFMLProject LANGUAGES CXX VERSION 1.0.0)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)

include(FetchContent)
FetchContent_Declare(sfml
    GIT_REPOSITORY https://github.com/SFML/SFML.git
    GIT_TAG 2.6.x)

set(CPACK_SOURCE_IGNORE_FILES ${sfml_SOURCE_DIR})
if (NOT sfml_POPULATED)
    FetchContent_Populate(sfml)
    add_subdirectory(${sfml_SOURCE_DIR} ${sfml_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()

add_executable(CMakeSFMLProject src/main.cpp)
target_link_libraries(CMakeSFMLProject PRIVATE sfml-graphics)
target_compile_features(CMakeSFMLProject PRIVATE cxx_std_17)

if(WIN32)
    add_custom_command(
        TARGET CMakeSFMLProject
        COMMENT "Copy OpenAL DLL"
        PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SFML_SOURCE_DIR}/extlibs/bin/$<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,x64,x86>/openal32.dll $<TARGET_FILE_DIR:CMakeSFMLProject>
        VERBATIM)
endif()

set(OS_NAME "MacOS")
set(CPACK_GENERATOR "ZIP;DragNDrop")

set_target_properties(CMakeSFMLProject 
    PROPERTIES 
        MACOSX_BUNDLE TRUE
        INSTALL_RPATH "@executable_path/../Frameworks"
)

if(APPLE)
    # Set the install name directory for shared libraries to be relative to the executable
    set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks")

    # Copy SFML shared libraries into the app bundle
    install(DIRECTORY ${SFML_BINARY_DIR}/lib/ DESTINATION ${CMAKE_BINARY_DIR}/bin/${CMAKE_PROJECT_NAME}.app/Contents/Frameworks
            FILES_MATCHING PATTERN "*.dylib")

    # Create a macOS app bundle
    set(MACOS_BUNDLE_BUNDLE_NAME ${CMAKE_PROJECT_NAME})
    set(MACOS_BUNDLE_GUI_IDENTIFIER "com.example.${CMAKE_PROJECT_NAME}")
    set(MACOS_BUNDLE_ICON_FILE "")
    set(MACOS_BUNDLE_BUNDLE_VERSION "1.0.0")
    set(MACOS_BUNDLE_SHORT_VERSION_STRING "1.0.0")

    install(TARGETS CMakeSFMLProject
            BUNDLE DESTINATION . COMPONENT Runtime)
endif()

# Set the CPack properties
set(CPACK_BUNDLE_NAME "Example")
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-${OS_NAME}")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Example")
set(CPACK_PACKAGE_VENDOR "SFML")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md")
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.md")
set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}")

include(CPack)

程序包内容结构如下:

:: tree CMakeSFMLProject.app 
CMakeSFMLProject.app
└── Contents
    ├── Frameworks
    │   ├── libsfml-audio.2.6.1.dylib
    │   ├── libsfml-audio.2.6.dylib -> libsfml-audio.2.6.1.dylib
    │   ├── libsfml-audio.dylib -> libsfml-audio.2.6.dylib
    │   ├── libsfml-graphics.2.6.1.dylib
    │   ├── libsfml-graphics.2.6.dylib -> libsfml-graphics.2.6.1.dylib
    │   ├── libsfml-graphics.dylib -> libsfml-graphics.2.6.dylib
    │   ├── libsfml-network.2.6.1.dylib
    │   ├── libsfml-network.2.6.dylib -> libsfml-network.2.6.1.dylib
    │   ├── libsfml-network.dylib -> libsfml-network.2.6.dylib
    │   ├── libsfml-system.2.6.1.dylib
    │   ├── libsfml-system.2.6.dylib -> libsfml-system.2.6.1.dylib
    │   ├── libsfml-system.dylib -> libsfml-system.2.6.dylib
    │   ├── libsfml-window.2.6.1.dylib
    │   ├── libsfml-window.2.6.dylib -> libsfml-window.2.6.1.dylib
    │   └── libsfml-window.dylib -> libsfml-window.2.6.dylib
    ├── Info.plist
    └── MacOS
        └── CMakeSFMLProject

请问如何正确使用cpack打包应用,使其能正常接收键盘事件?


内容的提问来源于stack exchange,提问作者K. Shores

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:35:01