使用cmake将Qt与SFML集成以进行跨平台开发

4dbbbstv  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(307)

我想使用cmake将Qt框架与SFML集成,希望在VS2022中。目前我的存储库中已经有SFML,cmake看起来像这样:

  1. cmake_minimum_required(VERSION 3.16)
  2. project(CMakeSFMLProject LANGUAGES CXX)
  3. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  4. option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
  5. include(FetchContent)
  6. FetchContent_Declare(SFML
  7. GIT_REPOSITORY https://github.com/SFML/SFML.git
  8. GIT_TAG 2.6.x)
  9. FetchContent_MakeAvailable(SFML)
  10. add_executable(CMakeSFMLProject src/main.cpp)
  11. target_link_libraries(CMakeSFMLProject PRIVATE sfml-graphics)
  12. target_compile_features(CMakeSFMLProject PRIVATE cxx_std_17)
  13. if(WIN32)
  14. add_custom_command(
  15. TARGET CMakeSFMLProject
  16. COMMENT "Copy OpenAL DLL"
  17. 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>
  18. VERBATIM)
  19. endif()
  20. install(TARGETS CMakeSFMLProject)

字符串
因此,在这个过程中,我想以某种方式添加Qt库。
我也想用VS编程,现在我只是打开这个仓库所在的文件夹,VS可以正常工作。我已经安装了Qt for VS,它可以工作,但我不知道如何将这两个框架集成在一起,也不知道如何使用它们。
目前更新后,我有以下内容:

  1. cmake_minimum_required(VERSION 3.16)
  2. project(PathFinder VERSION 1.0.0 LANGUAGES CXX)
  3. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  4. option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
  5. find_package(Qt6 REQUIRED COMPONENTS Core)
  6. include(FetchContent)
  7. FetchContent_Declare(SFML
  8. GIT_REPOSITORY https://github.com/SFML/SFML.git
  9. GIT_TAG 2.6.x)
  10. FetchContent_MakeAvailable(SFML)
  11. add_executable(PathFinder src/main.cpp)
  12. target_link_libraries(PathFinder PRIVATE
  13. Qt6::Core
  14. Qt6::Widgets
  15. sfml-graphics
  16. )
  17. target_compile_features(PathFinder PRIVATE cxx_std_17)
  18. if(WIN32)
  19. add_custom_command(
  20. TARGET PathFinder
  21. COMMENT "Copy OpenAL DLL"
  22. 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>
  23. VERBATIM)
  24. endif()
  25. install(TARGETS PathFinder)


但出于某种原因

  1. By not providing "FindQt6.cmake" in CMAKE_MODULE_PATH this project has
  2. asked CMake to find a package configuration file provided by "Qt6", but
  3. CMake did not find one.
  4. Could not find a package configuration file provided by "Qt6" with any of
  5. the following names:
  6. Qt6Config.cmake
  7. qt6-config.cmake
  8. Add the installation prefix of "Qt6" to CMAKE_PREFIX_PATH or set "Qt6_DIR"
  9. to a directory containing one of the above files. If "Qt6" provides a
  10. separate development package or SDK, be sure it has been installed. PathFinder C:\Users\nhorv\Desktop\proba\CMakeLists.txt 7


但我想在本地包含Qt,这样用户就不必手动设置PATH变量。我想将Qt作为依赖项安装,而不是在系统范围内安装。这可以使用Qt的git repo吗?

vwoqyblh

vwoqyblh1#

这是我的CMakeLists.txt文件:

  1. cmake_minimum_required(VERSION 3.5)
  2. project(SFMLQt VERSION 0.1 LANGUAGES CXX)
  3. set(CMAKE_AUTOUIC ON)
  4. set(CMAKE_AUTOMOC ON)
  5. set(CMAKE_AUTORCC ON)
  6. set(CMAKE_CXX_STANDARD 17)
  7. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  8. find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
  9. find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
  10. # Find SFML
  11. find_package(SFML 2.5 COMPONENTS graphics REQUIRED)
  12. set(PROJECT_SOURCES
  13. main.cpp
  14. mainwindow.cpp
  15. mainwindow.h
  16. mainwindow.ui
  17. )
  18. if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
  19. qt_add_executable(SFMLQt
  20. MANUAL_FINALIZATION
  21. ${PROJECT_SOURCES}
  22. )
  23. else()
  24. if(ANDROID)
  25. add_library(SFMLQt SHARED
  26. ${PROJECT_SOURCES}
  27. )
  28. else()
  29. add_executable(SFMLQt
  30. ${PROJECT_SOURCES}
  31. )
  32. endif()
  33. endif()
  34. target_link_libraries(SFMLQt PRIVATE Qt${QT_VERSION_MAJOR}::Widgets sfml-graphics)
  35. # Set target properties
  36. if(${QT_VERSION} VERSION_LESS 6.1.0)
  37. set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.SFMLQt)
  38. endif()
  39. set_target_properties(SFMLQt PROPERTIES
  40. ${BUNDLE_ID_OPTION}
  41. MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
  42. MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
  43. MACOSX_BUNDLE TRUE
  44. WIN32_EXECUTABLE TRUE
  45. )
  46. include(GNUInstallDirs)
  47. install(TARGETS SFMLQt
  48. BUNDLE DESTINATION .
  49. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  50. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  51. )
  52. if(QT_VERSION_MAJOR EQUAL 6)
  53. qt_finalize_executable(SFMLQt)
  54. endif()

字符串
这是一个最小的例子:

  1. #include <SFML/Graphics.hpp>
  2. int main()
  3. {
  4. sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Example");
  5. sf::CircleShape shape(50.f);
  6. shape.setFillColor(sf::Color::Green);
  7. while (window.isOpen())
  8. {
  9. sf::Event event;
  10. while (window.pollEvent(event))
  11. {
  12. if (event.type == sf::Event::Closed)
  13. {
  14. window.close();
  15. }
  16. }
  17. window.clear();
  18. window.draw(shape);
  19. window.display();
  20. }
  21. return 0;
  22. }


输出量:


的数据
但问题是,我的操作系统是Ubuntu 22.04,对于Windows,你需要用同样的方法来做。意思是这样的:

  1. cmake_minimum_required(VERSION 3.16)
  2. project(CMakeSFMLProject LANGUAGES CXX)
  3. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  4. option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
  5. # Find Qt
  6. find_package(Qt5 COMPONENTS Widgets REQUIRED)
  7. include(FetchContent)
  8. FetchContent_Declare(SFML
  9. GIT_REPOSITORY https://github.com/SFML/SFML.git
  10. GIT_TAG 2.6.x)
  11. FetchContent_MakeAvailable(SFML)
  12. add_executable(CMakeSFMLProject src/main.cpp)
  13. target_link_libraries(CMakeSFMLProject PRIVATE sfml-graphics Qt5::Widgets)
  14. target_compile_features(CMakeSFMLProject PRIVATE cxx_std_17)
  15. if(WIN32)
  16. add_custom_command(
  17. TARGET CMakeSFMLProject
  18. COMMENT "Copy OpenAL DLL"
  19. 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>
  20. VERBATIM)
  21. endif()
  22. install(TARGETS CMakeSFMLProject)

展开查看全部

相关问题