CMakeLists.txt 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. cmake_minimum_required(VERSION 3.16)
  2. project(ScreenWall VERSION 1.0.0 LANGUAGES CXX)
  3. # 设置C++标准
  4. set(CMAKE_CXX_STANDARD 17)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. # 查找Qt6组件
  7. find_package(Qt6 REQUIRED COMPONENTS
  8. Core
  9. Widgets
  10. OpenGL
  11. OpenGLWidgets
  12. )
  13. # 自动处理Qt的MOC、UIC、RCC
  14. set(CMAKE_AUTOMOC ON)
  15. set(CMAKE_AUTOUIC ON)
  16. set(CMAKE_AUTORCC ON)
  17. # 包含目录
  18. include_directories(
  19. ${CMAKE_CURRENT_SOURCE_DIR}
  20. ${CMAKE_CURRENT_SOURCE_DIR}/../AvRecorder
  21. ${CMAKE_CURRENT_SOURCE_DIR}/../AvRecorder/ui
  22. ${CMAKE_CURRENT_SOURCE_DIR}/../AvRecorder/capturer
  23. ${CMAKE_CURRENT_SOURCE_DIR}/../AvRecorder/capturer/finder
  24. ${CMAKE_CURRENT_SOURCE_DIR}/../AvRecorder/recorder
  25. ${CMAKE_CURRENT_SOURCE_DIR}/../AvRecorder/basic
  26. ${CMAKE_CURRENT_SOURCE_DIR}/../AV/code/recorder
  27. ${CMAKE_CURRENT_SOURCE_DIR}/../AV/code/recorder/ui
  28. ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/ffmpeg/include
  29. )
  30. # AvRecorder 源文件
  31. set(AVRECORDER_SOURCES
  32. ../AvRecorder/ui/opengl_video_widget.cpp
  33. ../AvRecorder/ui/audio_render.cpp
  34. ../AvRecorder/ui/audio_widget.cpp
  35. ../AvRecorder/ui/av_recorder.cpp
  36. ../AvRecorder/ui/settings_page.cpp
  37. ../AvRecorder/capturer/finder.cpp
  38. ../AvRecorder/capturer/ivideocapturer.cpp
  39. ../AvRecorder/recorder/video_recorder.cpp
  40. ../AvRecorder/recorder/audio_recorder.cpp
  41. ../AvRecorder/basic/basic.cpp
  42. ../AvRecorder/basic/frame.cpp
  43. ../AvRecorder/audioinput.cpp
  44. )
  45. # AvRecorder 头文件
  46. set(AVRECORDER_HEADERS
  47. ../AvRecorder/ui/opengl_video_widget.h
  48. ../AvRecorder/ui/audio_render.h
  49. ../AvRecorder/ui/audio_widget.h
  50. ../AvRecorder/ui/av_recorder.h
  51. ../AvRecorder/ui/settings_page.h
  52. ../AvRecorder/capturer/finder.h
  53. ../AvRecorder/capturer/base_capturer.h
  54. ../AvRecorder/recorder/video_recorder.h
  55. ../AvRecorder/recorder/audio_recorder.h
  56. ../AvRecorder/basic/basic.h
  57. ../AvRecorder/basic/frame.h
  58. ../AvRecorder/basic/timer.h
  59. ../AvRecorder/audioinput.h
  60. )
  61. # 源文件
  62. set(SOURCES
  63. main.cpp
  64. screenwall_widget.cpp
  65. ${AVRECORDER_SOURCES}
  66. )
  67. # 头文件
  68. set(HEADERS
  69. screenwall_widget.h
  70. ${AVRECORDER_HEADERS}
  71. )
  72. # Windows特定设置
  73. if(WIN32)
  74. # 添加Windows API库
  75. set(WIN32_LIBS
  76. dwmapi
  77. shell32
  78. psapi
  79. user32
  80. gdi32
  81. ole32
  82. oleaut32
  83. )
  84. endif()
  85. # 创建可执行文件
  86. add_executable(ScreenWall
  87. ${SOURCES}
  88. ${HEADERS}
  89. )
  90. # 链接Qt库
  91. target_link_libraries(ScreenWall
  92. Qt6::Core
  93. Qt6::Widgets
  94. Qt6::OpenGL
  95. Qt6::OpenGLWidgets
  96. )
  97. # 链接Windows库
  98. if(WIN32)
  99. target_link_libraries(ScreenWall ${WIN32_LIBS})
  100. endif()
  101. # FFmpeg 库查找(AvRecorder 依赖)
  102. set(FFMPEG_LIBS)
  103. # 查找 FFmpeg 库
  104. find_library(FFMPEG_AVCODEC_LIB
  105. NAMES avcodec
  106. PATHS
  107. ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/ffmpeg/lib
  108. ${CMAKE_CURRENT_SOURCE_DIR}/../lib
  109. NO_DEFAULT_PATH
  110. )
  111. find_library(FFMPEG_AVFORMAT_LIB
  112. NAMES avformat
  113. PATHS
  114. ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/ffmpeg/lib
  115. ${CMAKE_CURRENT_SOURCE_DIR}/../lib
  116. NO_DEFAULT_PATH
  117. )
  118. find_library(FFMPEG_AVUTIL_LIB
  119. NAMES avutil
  120. PATHS
  121. ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/ffmpeg/lib
  122. ${CMAKE_CURRENT_SOURCE_DIR}/../lib
  123. NO_DEFAULT_PATH
  124. )
  125. if(FFMPEG_AVCODEC_LIB AND FFMPEG_AVFORMAT_LIB AND FFMPEG_AVUTIL_LIB)
  126. list(APPEND FFMPEG_LIBS
  127. ${FFMPEG_AVCODEC_LIB}
  128. ${FFMPEG_AVFORMAT_LIB}
  129. ${FFMPEG_AVUTIL_LIB}
  130. )
  131. message(STATUS "Found FFmpeg libraries")
  132. target_link_libraries(ScreenWall ${FFMPEG_LIBS})
  133. else()
  134. message(WARNING "FFmpeg libraries not found. Some features may not work.")
  135. endif()
  136. # 编译器特定设置
  137. if(MSVC)
  138. # MSVC特定设置
  139. target_compile_definitions(ScreenWall PRIVATE
  140. _CRT_SECURE_NO_WARNINGS
  141. NOMINMAX
  142. WIN32_LEAN_AND_MEAN
  143. )
  144. # 设置运行时库
  145. set_property(TARGET ScreenWall PROPERTY
  146. MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
  147. endif()
  148. # 设置输出目录
  149. set_target_properties(ScreenWall PROPERTIES
  150. RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
  151. RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin
  152. RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin
  153. )
  154. # 安装规则
  155. install(TARGETS ScreenWall
  156. RUNTIME DESTINATION bin
  157. )
  158. # 复制Qt DLL(Windows)
  159. if(WIN32)
  160. # 获取Qt安装路径
  161. get_target_property(QT_QMAKE_EXECUTABLE Qt6::qmake IMPORTED_LOCATION)
  162. get_filename_component(QT_WINDEPLOYQT_EXECUTABLE ${QT_QMAKE_EXECUTABLE} PATH)
  163. set(QT_WINDEPLOYQT_EXECUTABLE "${QT_WINDEPLOYQT_EXECUTABLE}/windeployqt.exe")
  164. # 添加部署命令
  165. if(EXISTS ${QT_WINDEPLOYQT_EXECUTABLE})
  166. add_custom_command(TARGET ScreenWall POST_BUILD
  167. COMMAND ${QT_WINDEPLOYQT_EXECUTABLE} $<TARGET_FILE:ScreenWall>
  168. COMMENT "Deploying Qt libraries")
  169. endif()
  170. endif()
  171. # 打印配置信息
  172. message(STATUS "ScreenWall Configuration:")
  173. message(STATUS " Qt6 Version: ${Qt6_VERSION}")
  174. message(STATUS " Build Type: ${CMAKE_BUILD_TYPE}")
  175. message(STATUS " C++ Standard: ${CMAKE_CXX_STANDARD}")
  176. message(STATUS " Install Prefix: ${CMAKE_INSTALL_PREFIX}")
  177. # 添加编译选项
  178. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  179. target_compile_definitions(ScreenWall PRIVATE DEBUG_BUILD)
  180. message(STATUS " Debug build enabled")
  181. else()
  182. target_compile_definitions(ScreenWall PRIVATE RELEASE_BUILD)
  183. message(STATUS " Release build enabled")
  184. endif()
  185. # 添加版本信息
  186. target_compile_definitions(ScreenWall PRIVATE
  187. SCREENWALL_VERSION_MAJOR=${PROJECT_VERSION_MAJOR}
  188. SCREENWALL_VERSION_MINOR=${PROJECT_VERSION_MINOR}
  189. SCREENWALL_VERSION_PATCH=${PROJECT_VERSION_PATCH}
  190. SCREENWALL_VERSION_STRING="${PROJECT_VERSION}"
  191. )