TightVNC 2.8.11:(二)TvnViewer的Qt移植

环境

系统:Windows7 64位 旗舰版
Qt版本:5.6.0 msvc2018 64位
编译器:Visual Studio 2015 专业版

目的

1.提取TightVNC2.8.11中生成TvnViewer的源码;
2.用Qt的方式编译并运行TvnViewer,且保证编译出来的TvnViewer能正常运行。

步骤

1.新建一个Qt Widgets Application工程(名字自己取);
2.在新建好的工程中,把.pro和main.cpp以外的文件全部从工程中剔除并删掉,同时把main.cpp文件的#include语句和main()函数的函数体全部删掉,只保留一个main函数;
3.在工程目录中新建一个TvnViewer文件夹,然后把TightVNC源码里的tvnviewer文件夹下的TvnViewer.h和TvnViewer.cpp复制到工程目录下,然后添加到工程;
4.把源码的tvnviewer文件夹下main.cpp里面的#include语句和_tWinMain函数体,全部复制到新建工程的main.cpp文件中的头部和main()函数中;
5.编译工程,这个时候会报缺少文件错误(也会报语法错误,现在不管),这个时候从源码文件中复制对应的文件文件到新建的工程目录下并添加到工程中;
6.反复执行步骤5直到所有需要的文件都包含到工程中;
7.根据错误信息解决语法错误。
下面是我移植过程中遇到的错误,可能不完整,仅供参考:

错误:error: C2011: “sockaddr”:“struct”类型重定义
原因:sockaddr类型重定义错误, 实际上包括一大堆: sockaddr, ;sockaddr_in等等
解决:在.pro文件添加 DEFINES += WINSOCKAPI

问题:无法从“const char [1]”转换为“const StringStorage”
原因:当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen
当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen
解决:在.pro文件中添加:DEFINES += _UNICODE

错误:error: C2065: “hInstance”: 未声明的标识符
原因:hInstance变量未声明
解决:在调用hInstance变量前添加 HINSTANCE hInstance = GetModuleHandle(NULL);

错误:error: LNK2019: 无法解析的外部符号 xxxxx
原因:文件或库没有包含到工程中,无法找到函数实现
解决:找到函数实现的文件或者库,然后包含到工程中

错误:error: C2589: “(”:“::”右边的非法标记
原因:C++ 标准库函数与宏定义的名字冲突
解决:用()把标准库函数包起来,如:count = std::min(getLength(), count); 改成count = (std::min)(getLength(), count);

错误:无法将参数 从“const wchar_t [1]”转换为“LPWSTR”
原因:参数类型与函数声明的类型不一致
解决:在引用的参数前用类型转换符(LPWSTR)强制转换参数类型

错误:error: LNK2001: 无法解析的外部符号 __imp_MessageBoxW
原因:没有找到MessageBoxW函数的实现
解决:在.pro文件中添加MessageBoxW函数实现所在的库User32.lib,如win32:
LIBS += -L’C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x64/’ -lUser32

错误:无法将参数 3从“const wchar_t [1]”转换为“PVOID”
原因:参数类型与函数声明的类型不一致
解决:在引用的参数前用类型转换符(PVOID)强制转换参数类型

错误:无法从“const wchar_t [5]”转换为“TCHAR *”
原因:参数类型与变量声明的类型不一致
解决:在引用的参数前用类型转换符(TCHAR *)强制转换参数类型

错误:error: LNK2001: 无法解析的外部符号 __imp_DeleteObject
原因:没有找到DeleteObject函数的实现
解决:在.pro文件中添加DeleteObject函数实现所在的库Gdi32.lib,参考上面

错误:error: LNK2019: 无法解析的外部符号 __imp_InitCommonControlsEx
原因:没有找到InitCommonControlsEx函数的实现
解决:在.pro文件中添加InitCommonControlsEx函数实现所在的库ComCtl32.lib,参考上面

错误:error: LNK2019: 无法解析的外部符号 __imp_htonl
原因:没有找到htonl函数的实现
解决:在.pro文件中添加htonl函数实现所在的库WS2_32.lib,参考上面

错误:error: LNK2019: 无法解析的外部符号 __imp_GetSaveFileNameW
原因:没有找到GetSaveFileNameW函数的实现
解决:在.pro文件中添加GetSaveFileNameW函数实现所在的库ComDlg32.lib,参考上面

错误:error: LNK2019: 无法解析的外部符号 inflate
原因:没有找到inflate函数的实现
解决:1.把源码的zlib文件夹下的inflate.c和nflate.h复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 __imp_RegCloseKey
原因:没有找到RegCloseKey函数的实现
解决:在.pro文件中添加RegCloseKey函数实现所在的库AdvAPI32.lib,参考上面

错误:error: LNK2019: 无法解析的外部符号 GetFileVersionInfoSizeW
原因:没有找到GetFileVersionInfoSizeW函数的实现
解决:在.pro文件中添加GetFileVersionInfoSizeW函数实现所在的库Version.lib,参考上面

错误:error: LNK2019: 无法解析的外部符号 jpeg_std_error
原因:没有找到jpeg_std_error函数的实现
解决:1.把源码的libjpeg文件夹下的jerror.c和jerror.h复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jpeg_CreateDecompress
原因:没有找到jpeg_CreateDecompress函数的实现
解决:1.把源码的libjpeg文件夹下的Jdapimin.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jpeg_mem_src
原因:没有找到jpeg_mem_src函数的实现
解决:1.把源码的libjpeg文件夹下的jdatasrc.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jpeg_start_decompress
原因:没有找到jpeg_start_decompress函数的实现
解决:1.把源码的libjpeg文件夹下的jdapistd.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jpeg_destroy
原因:没有找到jpeg_destroy函数的实现
解决:1.把源码的libjpeg文件夹下的jcomapi.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 adler32
原因:没有找到adler32函数的实现
解决:1.把源码的zlib文件夹下的adler32.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 crc32
原因:没有找到crc32函数的实现
解决:1.把源码的zlib文件夹下的adler32.c和adler32.h复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 GetModuleFileNameExW
原因:没有找到GetModuleFileNameExW函数的实现
解决:在.pro文件中添加GetModuleFileNameExW函数实现所在的库Psapi.lib,参考上面

错误:无法解析的外部符号 jinit_input_controller
原因:没有找到jinit_input_controller函数的实现
解决:1.把源码的libjpeg文件夹下的jdinput.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_marker_reader
原因:没有找到jinit_marker_reader函数的实现
解决:1.把源码的libjpeg文件夹下的jdmarker.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_memory_mgr
原因:没有找到jinit_memory_mgr函数的实现
解决:1.把源码的libjpeg文件夹下的jmemmgr.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_master_decompress
原因:没有找到jinit_master_decompress函数的实现
解决:1.把源码的libjpeg文件夹下的jdmaster.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jdiv_round_up
原因:没有找到jdiv_round_up函数的实现
解决:1.把源码的libjpeg文件夹下的jutils.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jpeg_get_small
原因:没有找到jpeg_get_small函数的实现
解决:1.把源码的libjpeg文件夹下的jmemnobs.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_d_main_controller
原因:没有找到jinit_d_main_controller函数的实现
解决:1.把源码的libjpeg文件夹下的jdmainct.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_d_coef_controller
原因:没有找到jinit_d_coef_controller函数的实现
解决:1.把源码的libjpeg文件夹下的jdcoefct.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_d_post_controller
原因:没有找到jinit_d_post_controller函数的实现
解决:1.把源码的libjpeg文件夹下的jdpostct.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_huff_decoder
原因:没有找到jinit_huff_decoder函数的实现
解决:1.把源码的libjpeg文件夹下的jdhuff.c和jdhuff.h复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_arith_decoder
原因:没有找到jinit_arith_decoder函数的实现
解决:1.把源码的libjpeg文件夹下的jdarith.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_inverse_dct
原因:没有找到jinit_inverse_dct函数的实现
解决:1.把源码的libjpeg文件夹下的jddctmgr.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_upsampler
原因:没有找到jinit_upsampler函数的实现
解决:1.把源码的libjpeg文件夹下的jdsample.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_color_deconverter
原因:没有找到jinit_color_deconverter函数的实现
解决:1.把源码的libjpeg文件夹下的jdcolor.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_1pass_quantizer
原因:没有找到jinit_1pass_quantizer函数的实现
解决:1.把源码的libjpeg文件夹下的jquant1.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_2pass_quantizer
原因:没有找到jinit_2pass_quantizer函数的实现
解决:1.把源码的libjpeg文件夹下的jquant2.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_merged_upsampler
原因:没有找到jinit_merged_upsampler函数的实现
解决:1.把源码的libjpeg文件夹下的jdmerge.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2001: 无法解析的外部符号 jpeg_aritab
原因:没有找到jpeg_aritab函数的实现
解决:1.把源码的libjpeg文件夹下的jaricom.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:error: LNK2019: 无法解析的外部符号 jinit_memory_mgr
原因:没有找到jinit_memory_mgr函数的实现
解决:1.把源码的libjpeg文件夹下的jmemmgr.c复制到工程相应的位置;
2.把复制过来的文件添加到工程中,然后qmake、编译

错误:_ASSERT(window != NULL);断言失败
原因:找不到映像文件中指定的资源类型
解决:1.把源码的tvnviewer文件夹下的tvnviewer.rc复制到工程相应的位置;
2.在.pro文件中添加RC_FILE += TvnViewer/tvnviewer.rc,然后qmake、编译

参考源码

猜你喜欢

转载自blog.csdn.net/chase_hung/article/details/80725295
今日推荐