TightVNC 2.8.11:(二)TvnViewer的Qt移植_qt 怎么调用vnc view的源码_chase_hung的博客-程序员宅基地

技术标签: C++  Qt  TvnViewer  TightVNC  

环境

系统:Windows7 64位 旗舰版
Qt版本:5.6.0 msvc2015 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、编译

参考源码

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chase_hung/article/details/80725295

智能推荐

GDOI2018记录-程序员宅基地

​   说实话,直到初三暑假升高一的时候,我才开始形成竞赛观。那时才顿觉一年的各个比赛是多么重要。  ​   紧接着我的NOIP就直接爆炸了。这意味着我一年也完蛋了。各种人去WC,然后我留在家里。    ​ 那GDOI也只能连炸了,因为有30%的NOIP分数,我觉得我今年也做不了什么了。      DAY0  ​   下午出发很快就到酒店了。去一中吃完饭以后,隔着电脑室的门看到..._gdoi 2018 排名

Panel 页面布局篇_panel 里region如何设置-程序员宅基地

布局篇 1.panel accordion 布局 var panel = new Ext.Panel({ layout : 'accordion', layoutConfig : { activeOnTop : true,//设置打开的子面板置顶 fill : true,//子面板充满父面板的_panel 里region如何设置

hdu1026 Ignatius and the Princess I BFS-程序员宅基地

http://acm.hdu.edu.cn/showproblem.php?pid=1026Ignatius and the Princess ITime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9535 A

as86汇编器_@HDS的博客-程序员宅基地

as86汇编器在Linux 0.x系统中使用了两种汇编器(Assembler)。一种是能产生16位代码的as86汇编器,使用配套的ld86链接器;另一种是GNU的汇编器gas(as),使用GNU ld链接器来链接产生的目标文件。这里我们首先说明as86汇编器的使用方法。as86和ld86是由MINIX-386的主要开发者之一Bruce Evans编写的Intel 8086,80386汇编编译程..._as86

primary主库上创建表空间无法同步到物理standby和逻辑standby-程序员宅基地

primary创建表空间无法同步到物理standby和逻辑standby环境是dataguard 一个主库 一个物理standby 一个逻辑standby在主库创建表空间,无法同步到物理standby和逻辑standbySQL> create tablespace test datafile 'F:\APP\ADMINISTRATOR\ORADATA\CTW\test.dbf

java8 新特性函数式编程lambda和stream详解-程序员宅基地

一、初识lambda表达式 lambda表达式是一个匿名函数,我们可以把lamdba表达式理解为是一段可以传递的代码。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,是java的语言表达能力得到了提升。 先不说语法,我们先来做一个需求: 获取当前公司中员工年龄大于35的员工信息List<Person> emps = ...

随便推点

angular6+,表单异步校验_angular6 表单异步验证-程序员宅基地

资源地址:https://www.npmjs.com/package/great-ngform示例代码:https://gitee.com/zhtt/angular-demo示例演示: http://zhtt.gitee.io/angular-demo/angular/dist/angular/#/form/reactivenpm install great-ngform --save..._angular6 表单异步验证

js动态创建a标签,模拟点击下载文件;通过动态创建iframe下载文件-程序员宅基地

方式一:js动态创建a标签,js模拟点击下载文件var a = document.createElement('a');a.href = "www.baiduggx.com/123.jpg";a.id = "img0091";a.download = "123.jpg";a.style = "display:none";document.body.appendChild(a);document.getElementById("img0091").click();

Python快速找出两个列表中的差集、并集、交集_python 差集-程序员宅基地

前言众所周知,当想要用python比较两个列表元素中的差集的时候,或许有很多人会想到用for循环进行遍历,再结合append函数,找出它们之间的差集。不可否认,这种方法确实可以做到,但是在一个列表元素的数据量大的时候,用for循环进行遍历操作,效率上会大打折扣。那对于列表元素存在大量数据的时候,要怎么做?才能快速的拿到两个列表元素的差集呢?下面跟着小编,直接进入本文的正题差集 —— difference方法假设有下面两个列表a = [(2, 'aa', 'dsad'), (._python 差集

Hadoop集群部署模型纵览1-程序员宅基地

vSphere Big Data Extensions(简称BDE)支持多种部署方式来构建Hadoop集群。按:存储/计算绑定模型:将存储节点(Data Node)和计算节点(Task Tracker)部署在相同的虚拟机中。这是最直接简单的部署模型,可以用于概念验证和承载小规模集群的数据处理任务。单一计算模型:只部署计算节点(Job Tracker和Task Tracker)的集群类型。存储/计...

nacicat连接阿里云mysql 8_Navicat连接阿里云(centos7.3)的MySQL数据库遇到的问题及解决方法-阿里云开发者社区...-程序员宅基地

注:本文涉及到的解决方案都是我遇到的问题的对应解决方案,不一定适用于每一个人,如果问题仍然存在,请继续百度查询其他解决方法首先是登录阿里云MySQL的一些必要信息(登录其他云主机的mysql同理):使用ssh的方式连接到linux,具体连接参数的填写见下图注意:网上很多教程写的连接方式中“主机名或IP地址”一栏写的都是公网ip,我实际使用中用公网ip连接始终报错,显示错误:2013-Lost co..._navicat mysql8 waiting for initial communication packet

推荐文章

热门文章

相关标签