利用tcp/ip把手机投影到电脑上,不需要数据线连接,利用同一个局限网,实现无线连接。
我找了很多资料,还是选择QtScrcpy。
其中原因有三:
QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备,并进行显示和控制。不需要root权限。
同时支持GNU/Linux,Windows和MacOS三大主流桌面平台。
具体内容,就不再描述了,传送门:中文 英文
接下来,如何下载、如何编译、如何使用。
准备什么,首先阅读作者的README.md,其中有说明安装过程,传送
Build
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 version>=5.12 (use MSVC 2019 on Windows)
2. Clone the project
3. Open the project root directory all.pro or CMakeLists.txt with QtCreator
4. Compile and run
上面描述,我们需要下载一些必备的依赖软件。
缺了一个,那就不行了。至于如何安装,就不讲了。
下载方式很多,能下载就OK。
我选择git克隆方法,于是打开poewrshell这个命令行。
如下代码:
按照我步骤去做,总算没错吧。
cd d:\
mkdir tools
cd tools
git clone https://github.com/barry-ran/QtScrcpy.git
cd QtScrcpy\QtScrcpy
mkdir build
cd build
目前位置:d:\tools\QtScrcpy\QtScrcpy\build
命令输出结果:
PS D:\> cd tools
PS D:\tools> git clone https://github.com/barry-ran/QtScrcpy.git
Cloning into 'QtScrcpy'...
remote: Enumerating objects: 5363, done.
remote: Counting objects: 100% (579/579), done.
remote: Compressing objects: 100% (291/291), done.
remote: Total 5363 (delta 299), reused 460 (delta 273), pack-reused 4784Receiving objects: 100% (5363/5363), 403.14 MiB Receiving objects: 100% (5363/5363), 403.24 MiB | xx.00 MiB/s, done.
Resolving deltas: 100% (3501/3501), done.
Updating files: 100% (374/374), done.
PS D:\tools> cd .\QtScrcpy\QtScrcpy\
PS D:\tools\QtScrcpy\QtScrcpy> mkdir build
PS D:\tools\QtScrcpy\QtScrcpy> cd build
PS D:\tools\QtScrcpy\QtScrcpy\build>
提示:下载过程中数据不时出现断开网络或者没反应的情况,换个方式下载吧。
编译时首先检查QT_DIR环境变量是否存在,若没有则设置
如下代码:
cmake -G "MinGW Makefiles" ..
# 选择MingW编译器,利用cmake编译一下.
结果输出如下:
PS D:\tools\QtScrcpy\QtScrcpy\build> cmake -G "MinGW Makefiles" ..
-- The CXX compiler identification is GNU 8.1.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/XXXX/mingw/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- [QtScrcpy] Project QtScrcpy 0.0.0
-- [QtScrcpy] CPU_ARCH:x64
-- [QtScrcpy] BUILD_TYPE:RelWithDebInfo
-- [QtScrcpy] C++ compiler ID is: GNU
-- [QtScrcpy] Set warnings as error
-- [QtScrcpy] Qt version is: 5.12
-- multi config:QC_IS_MUTIL_CONFIG
-- Configuring done
-- Generating done
-- Build files have been written to: D:/tools/QtScrcpy/QtScrcpy/build
PS D:\tools\QtScrcpy\QtScrcpy\build>
这时候在D:\tools\QtScrcpy\QtScrcpy\build上出现几个文件,其中Makefile文件,则表示可以用make命令,如下代码:
make
make命令后会发现有些问题,错误结果是:
PS D:\tools\QtScrcpy\QtScrcpy\build> make
[ 2%] Automatic MOC and UIC for target QtScrcpy
[ 2%] Built target QtScrcpy_autogen
[ 4%] Automatic RCC for res/res.qrc
Scanning dependencies of target QtScrcpy
[ 7%] Building CXX object CMakeFiles/QtScrcpy.dir/QtScrcpy_autogen/mocs_compilation.cpp.obj
[ 9%] Building CXX object CMakeFiles/QtScrcpy.dir/adb/adbprocess.cpp.obj
[ 12%] Building CXX object CMakeFiles/QtScrcpy.dir/device/device.cpp.obj
[ 14%] Building CXX object CMakeFiles/QtScrcpy.dir/device/controller/controller.cpp.obj
[ 17%] Building CXX object CMakeFiles/QtScrcpy.dir/device/controller/inputconvert/inputconvertbase.cpp.obj
[ 19%] Building CXX object CMakeFiles/QtScrcpy.dir/device/controller/inputconvert/inputconvertnormal.cpp.obj
[ 21%] Building CXX object CMakeFiles/QtScrcpy.dir/device/controller/inputconvert/inputconvertgame.cpp.obj
[ 24%] Building CXX object CMakeFiles/QtScrcpy.dir/device/controller/inputconvert/controlmsg.cpp.obj
[ 26%] Building CXX object CMakeFiles/QtScrcpy.dir/device/controller/inputconvert/keymap/keymap.cpp.obj
[ 29%] Building CXX object CMakeFiles/QtScrcpy.dir/device/controller/receiver/devicemsg.cpp.obj
[ 31%] Building CXX object CMakeFiles/QtScrcpy.dir/device/controller/receiver/receiver.cpp.obj
[ 34%] Building CXX object CMakeFiles/QtScrcpy.dir/device/decoder/avframeconvert.cpp.obj
[ 36%] Building CXX object CMakeFiles/QtScrcpy.dir/device/decoder/decoder.cpp.obj
[ 39%] Building CXX object CMakeFiles/QtScrcpy.dir/device/decoder/fpscounter.cpp.obj
[ 41%] Building CXX object CMakeFiles/QtScrcpy.dir/device/decoder/videobuffer.cpp.obj
[ 43%] Building CXX object CMakeFiles/QtScrcpy.dir/device/filehandler/filehandler.cpp.obj
[ 46%] Building CXX object CMakeFiles/QtScrcpy.dir/device/recorder/recorder.cpp.obj
[ 48%] Building CXX object CMakeFiles/QtScrcpy.dir/device/render/qyuvopenglwidget.cpp.obj
[ 51%] Building CXX object CMakeFiles/QtScrcpy.dir/device/server/server.cpp.obj
[ 53%] Building CXX object CMakeFiles/QtScrcpy.dir/device/server/tcpserver.cpp.obj
[ 56%] Building CXX object CMakeFiles/QtScrcpy.dir/device/server/videosocket.cpp.obj
[ 58%] Building CXX object CMakeFiles/QtScrcpy.dir/device/stream/stream.cpp.obj
[ 60%] Building CXX object CMakeFiles/QtScrcpy.dir/device/ui/toolform.cpp.obj
[ 63%] Building CXX object CMakeFiles/QtScrcpy.dir/device/ui/videoform.cpp.obj
[ 65%] Building CXX object CMakeFiles/QtScrcpy.dir/devicemanage/devicemanage.cpp.obj
[ 68%] Building CXX object CMakeFiles/QtScrcpy.dir/fontawesome/iconhelper.cpp.obj
[ 70%] Building CXX object CMakeFiles/QtScrcpy.dir/uibase/keepratiowidget.cpp.obj
[ 73%] Building CXX object CMakeFiles/QtScrcpy.dir/uibase/magneticwidget.cpp.obj
[ 75%] Building CXX object CMakeFiles/QtScrcpy.dir/util/config.cpp.obj
[ 78%] Building CXX object CMakeFiles/QtScrcpy.dir/util/bufferutil.cpp.obj
[ 80%] Building CXX object CMakeFiles/QtScrcpy.dir/util/mousetap/mousetap.cpp.obj
[ 82%] Building CXX object CMakeFiles/QtScrcpy.dir/util/mousetap/winmousetap.cpp.obj
[ 85%] Building CXX object CMakeFiles/QtScrcpy.dir/main.cpp.obj
[ 87%] Building CXX object CMakeFiles/QtScrcpy.dir/dialog.cpp.obj
[ 90%] Building RC object CMakeFiles/QtScrcpy.dir/res/QtScrcpy.rc.obj
D:\tools\QtScrcpy\QtScrcpy\res\QtScrcpy.rc:1:10: fatal error: winres.h: No such file or directory
#include "winres.h"
^~~~~~~~~~
compilation terminated.
D:\workers\mingw\bin\windres.exe: preprocessing failed.
make[2]: *** [CMakeFiles\QtScrcpy.dir\build.make:623: CMakeFiles/QtScrcpy.dir/res/QtScrcpy.rc.obj] Error 1
make[1]: *** [CMakeFiles\Makefile2:83: CMakeFiles/QtScrcpy.dir/all] Error 2
make: *** [makefile:90: all] Error 2
PS D:\tools\QtScrcpy\QtScrcpy\build>
请移步看下错误1的原因分析和解决方案。
做好了,接下来,如下命令:
make
输出结果如下:
PS D:\tools\QtScrcpy\QtScrcpy\build> make
[ 2%] Automatic MOC and UIC for target QtScrcpy
[ 2%] Built target QtScrcpy_autogen
[ 4%] Building RC object CMakeFiles/QtScrcpy.dir/res/QtScrcpy.rc.obj
D:\workers\mingw\bin\windres.exe: D:\\tools\\QtScrcpy\\QtScrcpy\\res\\QtScrcpy.rc:25: syntax error
make[2]: *** [CMakeFiles\QtScrcpy.dir\build.make:623: CMakeFiles/QtScrcpy.dir/res/QtScrcpy.rc.obj] Error 1
make[1]: *** [CMakeFiles\Makefile2:83: CMakeFiles/QtScrcpy.dir/all] Error 2
make: *** [makefile:90: all] Error 2
PS D:\tools\QtScrcpy\QtScrcpy\build>
请移步看下错误2的原因分析和解决方案。
做好了,接下来,如下命令:
make
输出结果如下:
PS D:\tools\QtScrcpy\QtScrcpy\build> make
[ 2%] Automatic MOC and UIC for target QtScrcpy
[ 2%] Built target QtScrcpy_autogen
Scanning dependencies of target QtScrcpy
[ 4%] Building RC object CMakeFiles/QtScrcpy.dir/res/QtScrcpy.rc.obj
D:\tools\QtScrcpy\QtScrcpy\res\QtScrcpy.rc:5: warning: "VERSION_RC_STR" redefined
#define VERSION_RC_STR "rx-ted"
-line>: note: this is the location of the previous definition
[ 7%] Building CXX object CMakeFiles/QtScrcpy.dir/QtScrcpy_autogen/PNK5WDWK6L/qrc_res.cpp.obj
[ 9%] Linking CXX executable D:\tools\QtScrcpy\output\x64\RelWithDebInfo\QtScrcpy.exe
[100%] Built target QtScrcpy
意味着成功了,定位到 D:\tools\QtScrcpy\output\x64\RelWithDebInfo这个文件夹,并打开这个程序,是否运行成功。
如下截图:
上面如何下载,编译,使用,我就讲完了。 不管遇到问题,学会思考,为什么会出现错误,尝试能不能独立解决这个问题,并总结一下,若时间允许的话,可以记笔记。
D:\tools\QtScrcpy\QtScrcpy\res\QtScrcpy.rc:1:10: fatal error: winres.h: No such file or directory
#include "winres.h"
^~~~~~~~~~
compilation terminated.
D:\workers\mingw\bin\windres.exe: preprocessing failed.
make[2]: *** [CMakeFiles\QtScrcpy.dir\build.make:623: CMakeFiles/QtScrcpy.dir/res/QtScrcpy.rc.obj] Error 1
make[1]: *** [CMakeFiles\Makefile2:83: CMakeFiles/QtScrcpy.dir/all] Error 2
make: *** [makefile:90: all] Error 2
这个错误告诉我winres.h没有这个库,只要找到winres.h源代码,然后导入库,就行了。
PS D:\tools\QtScrcpy\QtScrcpy\build> make
[ 2%] Automatic MOC and UIC for target QtScrcpy
[ 2%] Built target QtScrcpy_autogen
[ 4%] Building RC object CMakeFiles/QtScrcpy.dir/res/QtScrcpy.rc.obj
D:\workers\mingw\bin\windres.exe: D:\\tools\\QtScrcpy\\QtScrcpy\\res\\QtScrcpy.rc:25: syntax error
make[2]: *** [CMakeFiles\QtScrcpy.dir\build.make:623: CMakeFiles/QtScrcpy.dir/res/QtScrcpy.rc.obj] Error 1
make[1]: *** [CMakeFiles\Makefile2:83: CMakeFiles/QtScrcpy.dir/all] Error 2
make: *** [makefile:90: all] Error 2
这个是语法错误,要么注释,要么修改winres.h源代码。
D:\tools\QtScrcpy\QtScrcpy\res\QtScrcpy.rc:1:10到这行就错了,说明附近没有winres.h,那么我们只要在D:\tools\QtScrcpy\QtScrcpy\res上新建winres.h就行了,如下代码:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1999 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
// winres.h - Windows resource definitions
// extracted from WINUSER.H and COMMCTRL.H
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, off)
#endif
#define VS_VERSION_INFO 1
#ifdef APSTUDIO_INVOKED
#define APSTUDIO_HIDDEN_SYMBOLS // Ignore following symbols
#endif
#ifndef WINVER
#define WINVER 0x0400 // default to Windows Version 4.0
#endif
#include
#ifdef _MAC
#define DS_WINDOWSUI 0x8000L
#endif
// operation messages sent to DLGINIT
#define LB_ADDSTRING (WM_USER+1)
#define CB_ADDSTRING (WM_USER+3)
#ifdef APSTUDIO_INVOKED
#undef APSTUDIO_HIDDEN_SYMBOLS
#endif
#ifdef IDC_STATIC
#undef IDC_STATIC
#endif
#define IDC_STATIC (-1)
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
D:\tools\QtScrcpy\QtScrcpy\res\QtScrcpy.rc:25: syntax error
方法1
打开QtScrcpy.rc这个文件,然后注释一下。
#include "winres.h"
IDI_ICON1 ICON "QtScrcpy.ico"
// GB2312编码的话,在中文系统上打包FileDescription可以显示中文
// 在github action(英文系统)打包后FileDescription是乱码,utf8编码也不行。。
VS_VERSION_INFO VERSIONINFO
FILEVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH
PRODUCTVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080404b0"
BEGIN
VALUE "CompanyName", "RanKun"
VALUE "FileDescription", "Android real-time display control software"
// VALUE "FileVersion", VERSION_RC_STR
VALUE "LegalCopyright", "Copyright (C) RanKun 2018-2038. All rights reserved."
VALUE "ProductName", "QtScrcpy"
// VALUE "ProductVersion", VERSION_RC_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 1200
END
END
方法2
知道VERSION_RC_STR没有被定义,我们只要重新定义就行了。
打开QtScrcpy.rc这个文件,然后修改一下。
#include "winres.h"
#define VERSION_RC_STR "rx-ted"
IDI_ICON1 ICON "QtScrcpy.ico"
// GB2312编码的话,在中文系统上打包FileDescription可以显示中文
// 在github action(英文系统)打包后FileDescription是乱码,utf8编码也不行。。
VS_VERSION_INFO VERSIONINFO
FILEVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH
PRODUCTVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080404b0"
BEGIN
VALUE "CompanyName", "RanKun"
VALUE "FileDescription", "Android real-time display control software"
VALUE "FileVersion", VERSION_RC_STR
VALUE "LegalCopyright", "Copyright (C) RanKun 2018-2038. All rights reserved."
VALUE "ProductName", "QtScrcpy"
VALUE "ProductVersion", VERSION_RC_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 1200
END
END