Merge branch 'dev' of github.com:barry-ran/QtScrcpy into dev

This commit is contained in:
Barry 2021-06-27 13:01:42 +08:00
commit 0965a0b2ff
3 changed files with 190 additions and 149 deletions

View file

@ -18,7 +18,7 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Network LinguistTools REQU
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
# ffmpeg cannot be compiled natively by MSVC version < 12.0 (2013)
# FFmpeg cannot be compiled natively by MSVC version < 12.0 (2013)
if(MSVC_VERSION LESS 1800)
message(FATAL_ERROR "[QtScrcpy] FATAL ERROR: MSVC version is older than 12.0 (2013).")
endif()
@ -28,149 +28,18 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
endif()
# ******************** Microsoft Windows ********************
if(WIN32)
message(STATUS "[QtScrcpy] Make for Microsoft Windows.")
# 通过rc的方式的话VERSION变量rc中获取不到,定义为宏方便rc中使用
# Define macros for .rc file
add_compile_definitions(
VERSION_MAJOR=${VERSION_MAJOR}
VERSION_MINOR=${VERSION_MINOR}
VERSION_PATCH=${VERSION_PATCH}
VERSION_RC_STR=\\\"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}\\\"
)
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Compiler is 64-bit
message(STATUS "[QtScrcpy] 64-bit compiler detected.")
set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x64")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/debug")
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/release")
endif()
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) # Compiler is 32-bit
message(STATUS "[QtScrcpy] 32-bit compiler detected.")
set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x86")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/debug")
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/release")
endif()
endif()
link_directories(${QS_DLL_PATH})
# 构建完成后复制DLL依赖库
# Copy DLL dependencies after building
file(GLOB QS_DLL_FILES "${QS_DLL_PATH}/*.dll")
foreach(QS_DLL_FILE ${QS_DLL_FILES})
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND
${CMAKE_COMMAND} -E copy_if_different
"${QS_DLL_FILE}" "${PROJECT_BINARY_DIR}"
)
endforeach()
set(QS_EXTERNAL_LIBS_FFMPEG
avformat
avcodec
avutil
swscale
# ==================== macOS ====================
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
# QS_MAC_RESOURCES: esource file list stored in Contents/MacOS
file(GLOB QS_MAC_RESOURCES "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/*.dylib")
list(APPEND QS_MAC_RESOURCES
"${PROJECT_SOURCE_DIR}/third_party/scrcpy-server"
"${PROJECT_SOURCE_DIR}/adb/mac/adb"
)
set(RC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/QtScrcpy.rc")
# ******************** Unix-like OSs ********************
elseif(UNIX)
set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib")
link_directories(${QS_LIB_PATH})
# ==================== macOS ====================
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
message(STATUS "[QtScrcpy] Make for macOS.")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/debug")
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/release")
endif()
# QS_MAC_RESOURCES: esource file list stored in Contents/MacOS
file(GLOB QS_MAC_RESOURCES "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/*.dylib")
list(APPEND QS_MAC_RESOURCES
"${PROJECT_SOURCE_DIR}/third_party/scrcpy-server"
"${PROJECT_SOURCE_DIR}/adb/mac/adb"
)
# QS_MAC_CONFIG: Config file stored in Contents/MacOS/config
set(QS_MAC_CONFIG "${PROJECT_SOURCE_DIR}/config/config.ini")
# Icon file stored in Contents/Resources
set(QS_MAC_ICON_NAME "QtScrcpy.icns")
set(QS_MAC_ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/res/${QS_MAC_ICON_NAME}")
set_source_files_properties(${QS_MAC_RESOURCES} PROPERTIES
MACOSX_PACKAGE_LOCATION "MacOS"
)
set_source_files_properties(${QS_MAC_CONFIG} PROPERTIES
MACOSX_PACKAGE_LOCATION "MacOS/config"
)
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
# The base plist template file
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/res/Info_Mac.plist"
# The elements to be overwritten
MACOSX_BUNDLE_ICON_FILE "${QS_MAC_ICON_NAME}"
MACOSX_BUNDLE_BUNDLE_VERSION "${STRING_VERSION}"
MACOSX_BUNDLE_SHORT_VERSION_STRING "${STRING_VERSION}"
MACOSX_BUNDLE_LONG_VERSION_STRING "${STRING_VERSION}"
# Copy file(s) to Contents/Resources
RESOURCE "${QS_MAC_ICON_PATH}"
)
set(QS_EXTERNAL_LIBS_FFMPEG
avformat.58
avcodec.58
avutil.56
swscale.5
)
# ========== Non-Mac Unix-like OS (Linux, BSD, etc.) ==========
else()
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/debug")
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/release")
endif()
find_package(Threads REQUIRED)
message(STATUS "[QtScrcpy] Make for non-Apple Unix-like OS.")
set(INSTALLED_FFMPEG_FOUND false)
find_package(PkgConfig)
if(PkgConfig_FOUND)
pkg_check_modules(FFmpeg ffmpeg>=4)
if(FFmpeg_FOUND)
set(INSTALLED_FFMPEG_FOUND true)
message(STATUS "[QtScrcpy] Development files of FFmpeg ${FFmpeg_VERSION} were detected in your OS and will be used.")
target_link_options(${CMAKE_PROJECT_NAME} "${FFmpeg_LIBRARIES}")
target_compile_options(${CMAKE_PROJECT_NAME} "${FFmpeg_CFLAGS}")
endif()
endif()
if(NOT INSTALLED_FFMPEG_FOUND)
message(STATUS "[QtScrcpy] Development files of FFmpeg were not detected in your OS. Files within third_party/ffmpeg/ will be used.")
set(QS_EXTERNAL_LIBS_FFMPEG
avformat
avcodec
avutil
swscale
Threads::Threads
)
endif()
endif()
# QS_MAC_CONFIG: Config file stored in Contents/MacOS/config
set(QS_MAC_CONFIG "${PROJECT_SOURCE_DIR}/config/config.ini")
endif()
set(QS_TS_FILES
@ -188,7 +57,7 @@ set(QS_SOURCES_MAIN
set(QS_QRC_MAIN "${CMAKE_CURRENT_SOURCE_DIR}/res/res.qrc")
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Qt version 6
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Qt version 6
qt_create_translation(QS_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${QS_TS_FILES})
if(WIN32)
@ -197,6 +66,7 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Qt version 6
${QS_SOURCES_MAIN}
${QS_QRC_MAIN}
)
elseif(UNIX)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
qt_add_executable(${CMAKE_PROJECT_NAME} MACOSX_BUNDLE MANUAL_FINALIZATION
@ -206,16 +76,18 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Qt version 6
${QS_MAC_CONFIG}
${QS_QRC_MAIN}
)
else()
qt_add_executable(${CMAKE_PROJECT_NAME} MANUAL_FINALIZATION
main.cpp
${QS_SOURCES_MAIN}
${QS_QRC_MAIN}
)
endif()
endif()
else() # Qt version 5
else() # Qt version 5
qt5_create_translation(QS_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${QS_TS_FILES})
if(WIN32)
@ -244,6 +116,174 @@ else() # Qt version 5
endif()
# ******************** Microsoft Windows ********************
if(WIN32)
message(STATUS "[QtScrcpy] Make for Microsoft Windows.")
# 通过rc的方式的话VERSION变量rc中获取不到,定义为宏方便rc中使用
# Define macros for .rc file
add_compile_definitions(
VERSION_MAJOR=${VERSION_MAJOR}
VERSION_MINOR=${VERSION_MINOR}
VERSION_PATCH=${VERSION_PATCH}
VERSION_RC_STR=\\\"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}\\\"
)
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Compiler is 64-bit
message(STATUS "[QtScrcpy] 64-bit compiler detected.")
set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x64")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "[QtScrcpy] In debug mode.")
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/debug"
)
else()
message(STATUS "[QtScrcpy] In release mode.")
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/release")
endif()
set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/bin/x64")
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) # Compiler is 32-bit
message(STATUS "[QtScrcpy] 32-bit compiler detected.")
set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x86")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "[QtScrcpy] In debug mode.")
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/debug")
else()
message(STATUS "[QtScrcpy] In release mode.")
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/release")
endif()
set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/bin/x86")
endif()
# 构建完成后复制DLL依赖库
# Copy DLL dependencies after building
get_target_property(QS_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_PROJECT_NAME} RUNTIME_OUTPUT_DIRECTORY)
file(GLOB QS_DLL_FILES "${QS_DLL_PATH}/*.dll")
foreach(QS_DLL_FILE ${QS_DLL_FILES})
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND
${CMAKE_COMMAND} -E copy_if_different
"${QS_DLL_FILE}" "${QS_RUNTIME_OUTPUT_DIRECTORY}"
)
endforeach()
# If MinGW is used, it is not appropriate to link static MSVC libs.
# Instead, we link DLLs directly
if(MSVC)
message(STATUS "[QtScrcpy] Microsoft Visual C++ is used.")
link_directories(${QS_LIB_PATH})
set(QS_EXTERNAL_LIBS_FFMPEG
avformat
avcodec
avutil
swscale
)
elseif(MINGW)
message(STATUS "[QtScrcpy] MinGW GCC is used.")
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE
"-static"
${QS_DLL_FILES}
"-Wl,--enable-stdcall-fixup"
)
endif()
set(RC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/QtScrcpy.rc")
# ******************** Unix-like OSs ********************
elseif(UNIX)
set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib")
# ==================== macOS ====================
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
message(STATUS "[QtScrcpy] Make for macOS.")
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE ${QS_LIB_PATH})
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/debug")
else()
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/release")
endif()
# Icon file stored in Contents/Resources
set(QS_MAC_ICON_NAME "QtScrcpy.icns")
set(QS_MAC_ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/res/${QS_MAC_ICON_NAME}")
set_source_files_properties(${QS_MAC_RESOURCES} PROPERTIES
MACOSX_PACKAGE_LOCATION "MacOS"
)
set_source_files_properties(${QS_MAC_CONFIG} PROPERTIES
MACOSX_PACKAGE_LOCATION "MacOS/config"
)
set(QS_EXTERNAL_LIBS_FFMPEG
avformat.58
avcodec.58
avutil.56
swscale.5
)
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
# The base plist template file
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/res/Info_Mac.plist"
# The elements to be overwritten
MACOSX_BUNDLE_ICON_FILE "${QS_MAC_ICON_NAME}"
MACOSX_BUNDLE_BUNDLE_VERSION "${STRING_VERSION}"
MACOSX_BUNDLE_SHORT_VERSION_STRING "${STRING_VERSION}"
MACOSX_BUNDLE_LONG_VERSION_STRING "${STRING_VERSION}"
# Copy file(s) to Contents/Resources
RESOURCE "${QS_MAC_ICON_PATH}"
)
# =============== Non-Mac OSs (Linux, BSD, etc.) ===============
else()
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/debug")
else()
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/release")
endif()
find_package(Threads REQUIRED)
message(STATUS "[QtScrcpy] Make for non-Mac Unix-like OS.")
set(INSTALLED_FFMPEG_FOUND false)
find_package(PkgConfig)
if(PkgConfig_FOUND)
pkg_check_modules(FFmpeg libavformat>=58 libavcodec>=58 libavutil>=56 libswscale>=5)
if(FFmpeg_FOUND)
set(INSTALLED_FFMPEG_FOUND true)
message(STATUS "[QtScrcpy] Development files of FFmpeg were detected in your OS and will be used.")
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE ${FFmpeg_LDFLAGS})
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE ${FFmpeg_CFLAGS})
set(QS_EXTERNAL_LIBS_FFMPEG ${FFmpeg_LIBRARIES})
endif()
endif()
if(NOT INSTALLED_FFMPEG_FOUND)
message(STATUS "[QtScrcpy] Development files of FFmpeg were not detected in your OS. Files within third_party/ffmpeg/ will be used.")
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE ${QS_LIB_PATH})
set(QS_EXTERNAL_LIBS_FFMPEG
avformat
avcodec
avutil
swscale
Threads::Threads
)
endif()
endif()
endif()
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
set(QS_SUBDIRECTORIES_MAIN
@ -273,7 +313,6 @@ target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE
util
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(${CMAKE_PROJECT_NAME})
endif()

View file

@ -246,7 +246,8 @@ There are several reasons listed as below according to importance (high to low).
All the dependencies are provided and it is easy to compile.
### PC client
1. Set up the Qt development environment on the target platform (Qt == 5.15.2, VS == 2019, MinGW not supported)
1. Set up the Qt development environment on the target platform.
An Up-to-date Qt5 (i.e. 5.15.2 or later) is recommended. For Windows, you can choose MSVC 2019 or MinGW 8.1.0, but please be noted that currently only **CMake** scripts support MinGW.
2. Clone the project
3. Open the project root directory `all.pro` or `CMakeLists.txt` with QtCreator
4. Compile and run
@ -280,7 +281,7 @@ Since it is based on scrcpy, respect its Licence
[Barry CSDN](https://blog.csdn.net/rankun1)
An ordinary programmer, working mainly in C++ for desktop client development, graduated from Shandong for more than a year of steel simulation education software, and later moved to Shanghai to work in security, online education related fields, familiar with audio and video. I have an understanding of audio and video fields such as voice calls, live education, video conferencing and other related solutions. At the same time have android, linux server and other development experience.
An ordinary programmer, working mainly in C++ for desktop client development, graduated from Shandong for more than a year of steel simulation education software, and later moved to Shanghai to work in security, online education related fields, familiar with audio and video. I have an understanding of audio and video fields such as voice calls, live education, video conferencing and other related solutions. I also have experience in Android, Linux server and other kinds of development.
## Contributors

View file

@ -243,10 +243,11 @@ Mac OS平台你可以直接使用我编译好的可执行程序:
尽量提供了所有依赖资源,方便傻瓜式编译。
### PC端
1. 目标平台上搭建Qt开发环境(Qt == 5.15.2, VS == 2019 (**不支持MinGW**))
1. 在目标平台上搭建Qt开发环境
我们建议使用最新的Qt5版本5.15.2或更高。在Windows上你可以自由选择MSVC 2019或MinGW 8.1.0,但需要注意的是现阶段只有**CMake**脚本提供了对MinGW的支持。
2. 克隆该项目
3. 使用QtCreator打开项目根目录`all.pro``CMakeLists.txt`
4. 编译,运行即可
4. 编译,运行
### Android端 没有修改需求的话直接使用自带的scrcpy-server即可
1. 目标平台上搭建Android开发环境
@ -276,4 +277,4 @@ Mac OS平台你可以直接使用我编译好的可执行程序:
[Barry的CSDN](https://blog.csdn.net/rankun1)
一枚普通的程序员工作中主要使用C++进行桌面客户端开发,一毕业在山东做过一年多钢铁仿真教育软件,后来转战上海先后从事安防,在线教育相关领域工作,对音视频比较熟悉,对音视频领域如语音通话,直播教育,视频会议等相关解决方案有所了解。同时具有androidlinux服务器等开发经验。
一枚普通的程序员工作中主要使用C++进行桌面客户端开发,一毕业在山东做过一年多钢铁仿真教育软件,后来转战上海先后从事安防,在线教育相关领域工作,对音视频比较熟悉,对音视频领域如语音通话,直播教育,视频会议等相关解决方案有所了解。同时具有AndroidLinux服务器等开发经验。