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

dev
Barry 5 years ago
commit 47c3e6af60

@ -18,7 +18,7 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Network LinguistTools REQU
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 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) if(MSVC_VERSION LESS 1800)
message(FATAL_ERROR "[QtScrcpy] FATAL ERROR: MSVC version is older than 12.0 (2013).") message(FATAL_ERROR "[QtScrcpy] FATAL ERROR: MSVC version is older than 12.0 (2013).")
endif() endif()
@ -28,6 +28,94 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
endif() endif()
# ==================== 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"
)
# 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
${CMAKE_CURRENT_SOURCE_DIR}/res/i18n/zh_CN.ts
${CMAKE_CURRENT_SOURCE_DIR}/res/i18n/en_US.ts
)
set_source_files_properties(${QS_TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/res/i18n")
set(QS_SOURCES_MAIN
dialog.cpp
dialog.h
dialog.ui
${QS_TS_FILES}
)
set(QS_QRC_MAIN "${CMAKE_CURRENT_SOURCE_DIR}/res/res.qrc")
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)
qt_add_executable(${CMAKE_PROJECT_NAME} WIN32 MANUAL_FINALIZATION
main.cpp
${QS_SOURCES_MAIN}
${QS_QRC_MAIN}
)
elseif(UNIX)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
qt_add_executable(${CMAKE_PROJECT_NAME} MACOSX_BUNDLE MANUAL_FINALIZATION
main.cpp
${QS_SOURCES_MAIN}
${QS_MAC_RESOURCES}
${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
qt5_create_translation(QS_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${QS_TS_FILES})
if(WIN32)
add_executable(${CMAKE_PROJECT_NAME} WIN32
main.cpp
${QS_SOURCES_MAIN}
${QS_QRC_MAIN}
)
elseif(UNIX)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
add_executable(${CMAKE_PROJECT_NAME} MACOSX_BUNDLE
main.cpp
${QS_SOURCES_MAIN}
${QS_MAC_RESOURCES}
${QS_MAC_CONFIG}
${QS_QRC_MAIN}
)
else()
add_executable(${CMAKE_PROJECT_NAME}
main.cpp
${QS_SOURCES_MAIN}
${QS_QRC_MAIN}
)
endif()
endif()
endif()
# ******************** Microsoft Windows ******************** # ******************** Microsoft Windows ********************
if(WIN32) if(WIN32)
message(STATUS "[QtScrcpy] Make for Microsoft Windows.") message(STATUS "[QtScrcpy] Make for Microsoft Windows.")
@ -41,70 +129,89 @@ if(WIN32)
VERSION_RC_STR=\\\"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}\\\" VERSION_RC_STR=\\\"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}\\\"
) )
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Compiler is 64-bit if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Compiler is 64-bit
message(STATUS "[QtScrcpy] 64-bit compiler detected.") message(STATUS "[QtScrcpy] 64-bit compiler detected.")
set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x64")
set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x64")
if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/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() else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/release") message(STATUS "[QtScrcpy] In release mode.")
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x64/release")
endif() endif()
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) # Compiler is 32-bit
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.") message(STATUS "[QtScrcpy] 32-bit compiler detected.")
set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x86")
set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib/x86")
if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/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() else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/release") message(STATUS "[QtScrcpy] In release mode.")
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/win/x86/release")
endif() endif()
endif()
link_directories(${QS_DLL_PATH}) set(QS_DLL_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/bin/x86")
endif()
# DLL # DLL
# Copy DLL dependencies after building # 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") file(GLOB QS_DLL_FILES "${QS_DLL_PATH}/*.dll")
foreach(QS_DLL_FILE ${QS_DLL_FILES}) foreach(QS_DLL_FILE ${QS_DLL_FILES})
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND
${CMAKE_COMMAND} -E copy_if_different ${CMAKE_COMMAND} -E copy_if_different
"${QS_DLL_FILE}" "${PROJECT_BINARY_DIR}" "${QS_DLL_FILE}" "${QS_RUNTIME_OUTPUT_DIRECTORY}"
) )
endforeach() endforeach()
set(QS_EXTERNAL_LIBS_FFMPEG # If MinGW is used, it is not appropriate to link static MSVC libs.
avformat # Instead, we link DLLs directly
avcodec if(MSVC)
avutil message(STATUS "[QtScrcpy] Microsoft Visual C++ is used.")
swscale 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") set(RC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/QtScrcpy.rc")
# ******************** Unix-like OSs ******************** # ******************** Unix-like OSs ********************
elseif(UNIX) elseif(UNIX)
set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib") set(QS_LIB_PATH "${PROJECT_SOURCE_DIR}/third_party/ffmpeg/lib")
link_directories(${QS_LIB_PATH})
# ==================== macOS ==================== # ==================== macOS ====================
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
message(STATUS "[QtScrcpy] Make for macOS.") message(STATUS "[QtScrcpy] Make for macOS.")
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE ${QS_LIB_PATH})
if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/debug") set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/debug")
else() else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/release") set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/mac/release")
endif() 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 # Icon file stored in Contents/Resources
set(QS_MAC_ICON_NAME "QtScrcpy.icns") set(QS_MAC_ICON_NAME "QtScrcpy.icns")
set(QS_MAC_ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/res/${QS_MAC_ICON_NAME}") set(QS_MAC_ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/res/${QS_MAC_ICON_NAME}")
@ -116,6 +223,13 @@ elseif(UNIX)
MACOSX_PACKAGE_LOCATION "MacOS/config" 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 set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
# The base plist template file # The base plist template file
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/res/Info_Mac.plist" MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/res/Info_Mac.plist"
@ -129,39 +243,36 @@ elseif(UNIX)
RESOURCE "${QS_MAC_ICON_PATH}" RESOURCE "${QS_MAC_ICON_PATH}"
) )
set(QS_EXTERNAL_LIBS_FFMPEG # =============== Non-Mac OSs (Linux, BSD, etc.) ===============
avformat.58
avcodec.58
avutil.56
swscale.5
)
# ========== Non-Mac Unix-like OS (Linux, BSD, etc.) ==========
else() else()
if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/debug") set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/debug")
else() else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/release") set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/output/linux/release")
endif() endif()
find_package(Threads REQUIRED) find_package(Threads REQUIRED)
message(STATUS "[QtScrcpy] Make for non-Apple Unix-like OS.") message(STATUS "[QtScrcpy] Make for non-Mac Unix-like OS.")
set(INSTALLED_FFMPEG_FOUND false) set(INSTALLED_FFMPEG_FOUND false)
find_package(PkgConfig) find_package(PkgConfig)
if(PkgConfig_FOUND) if(PkgConfig_FOUND)
pkg_check_modules(FFmpeg ffmpeg>=4) pkg_check_modules(FFmpeg libavformat>=58 libavcodec>=58 libavutil>=56 libswscale>=5)
if(FFmpeg_FOUND) if(FFmpeg_FOUND)
set(INSTALLED_FFMPEG_FOUND true) set(INSTALLED_FFMPEG_FOUND true)
message(STATUS "[QtScrcpy] Development files of FFmpeg ${FFmpeg_VERSION} were detected in your OS and will be used.") message(STATUS "[QtScrcpy] Development files of FFmpeg were detected in your OS and will be used.")
target_link_options(${CMAKE_PROJECT_NAME} "${FFmpeg_LIBRARIES}") target_link_options(${CMAKE_PROJECT_NAME} PRIVATE ${FFmpeg_LDFLAGS})
target_compile_options(${CMAKE_PROJECT_NAME} "${FFmpeg_CFLAGS}") target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE ${FFmpeg_CFLAGS})
set(QS_EXTERNAL_LIBS_FFMPEG ${FFmpeg_LIBRARIES})
endif() endif()
endif() endif()
if(NOT INSTALLED_FFMPEG_FOUND) 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.") 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 set(QS_EXTERNAL_LIBS_FFMPEG
avformat avformat
avcodec avcodec
@ -173,77 +284,6 @@ elseif(UNIX)
endif() endif()
endif() endif()
set(QS_TS_FILES
${CMAKE_CURRENT_SOURCE_DIR}/res/i18n/zh_CN.ts
${CMAKE_CURRENT_SOURCE_DIR}/res/i18n/en_US.ts
)
set_source_files_properties(${QS_TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/res/i18n")
set(QS_SOURCES_MAIN
dialog.cpp
dialog.h
dialog.ui
${QS_TS_FILES}
)
set(QS_QRC_MAIN "${CMAKE_CURRENT_SOURCE_DIR}/res/res.qrc")
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)
qt_add_executable(${CMAKE_PROJECT_NAME} WIN32 MANUAL_FINALIZATION
main.cpp
${QS_SOURCES_MAIN}
${QS_QRC_MAIN}
)
elseif(UNIX)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
qt_add_executable(${CMAKE_PROJECT_NAME} MACOSX_BUNDLE MANUAL_FINALIZATION
main.cpp
${QS_SOURCES_MAIN}
${QS_MAC_RESOURCES}
${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
qt5_create_translation(QS_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${QS_TS_FILES})
if(WIN32)
add_executable(${CMAKE_PROJECT_NAME} WIN32
main.cpp
${QS_SOURCES_MAIN}
${QS_QRC_MAIN}
)
elseif(UNIX)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
add_executable(${CMAKE_PROJECT_NAME} MACOSX_BUNDLE
main.cpp
${QS_SOURCES_MAIN}
${QS_MAC_RESOURCES}
${QS_MAC_CONFIG}
${QS_QRC_MAIN}
)
else()
add_executable(${CMAKE_PROJECT_NAME}
main.cpp
${QS_SOURCES_MAIN}
${QS_QRC_MAIN}
)
endif()
endif()
endif()
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
set(QS_SUBDIRECTORIES_MAIN set(QS_SUBDIRECTORIES_MAIN
@ -273,7 +313,6 @@ target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE
util util
) )
if(QT_VERSION_MAJOR EQUAL 6) if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(${CMAKE_PROJECT_NAME}) qt_finalize_executable(${CMAKE_PROJECT_NAME})
endif() endif()

@ -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. All the dependencies are provided and it is easy to compile.
### PC client ### 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 2. Clone the project
3. Open the project root directory `all.pro` or `CMakeLists.txt` with QtCreator 3. Open the project root directory `all.pro` or `CMakeLists.txt` with QtCreator
4. Compile and run 4. Compile and run
@ -280,7 +281,7 @@ Since it is based on scrcpy, respect its Licence
[Barry CSDN](https://blog.csdn.net/rankun1) [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 ## Contributors

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

Loading…
Cancel
Save