在 sfml cmake 项目的 我的 fork 上,我正在尝试使用 cpack
创建适用于 macOS 的应用程序包。我已成功复制所需的共享库。但是,没有键盘输入传递到应用程序。我修改了示例代码,使其具有一个圆圈,您可以使用箭头键移动它来测试它。我设置了这些 cpack 属性
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 捆绑在一起并仍然允许它接受键盘事件?
isKeyPressed
,这显然很糟糕。仅使用事件修复它类似的东西
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
if (event.type == sf::Event::KeyPressed) {
if (event.key.code == sf::Keyboard::Right) {
shape.move(moveSpeed, 0);
}
if (event.key.code == sf::Keyboard::Left) {
shape.move(-moveSpeed, 0);
}
if (event.key.code == sf::Keyboard::Up) {
shape.move(0, -moveSpeed);
}
if (event.key.code == sf::Keyboard::Down) {
shape.move(0, moveSpeed);
}
}
}