1. 程式人生 > >TightVNC 2.8.11:(二)TvnViewer的Qt移植

TightVNC 2.8.11:(二)TvnViewer的Qt移植

環境

系統: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、編譯

參考原始碼

相關推薦

TightVNC 2.8.11TvnViewer的Qt移植

環境 系統:Windows7 64位 旗艦版 Qt版本:5.6.0 msvc2015 64位 編譯器:Visual Studio 2015 專業版 目的 1.提取TightVNC2.8.11中生成TvnViewer的原始碼; 2.用Qt的方式編譯並執

安全性測試OWASP ZAP 2.8 使用指南ZAP基礎操作

ZAP桌面應用 ZAP桌面應用的UI由以下元素組成: 1. 選單欄  – 提供多種自動化和手動工具的訪問 2. 工具欄  – 提供快速訪問最常用元件的使用者介面 3. 樹結構視窗  – 展示被測網站樹結構和指令碼樹 4. 工作站視窗 &nb

java1.8實戰學習——總結流處理、行為引數化、並行與共享

上一篇:java1.8實戰學習(一) 下一篇:java1.8實戰學習(三) 我們繼續來看 預設方法 在加入所有這些新玩意兒改進Java 的時候, Java 8 設計者發現的一個現實問題就是現有的介面也在改進。比如, Collections.sort方法真的應該屬於Lis

CentOS 6.5下搭建hadoop 2.6.0叢集網路配置

以Master機器為例,即主機名為”Master.hadoop”,IP為”192.168.2.30”進行一些主機名配置的相關操作。其他的Slave機器以此為依據進行修改。 檢視當前機器名稱 用下面命令進行顯示機器名稱,如果跟規劃的不一致,要按照下面進行修

web前端面試題系列

html name 價值 編程 oct rom repeat 清除 frame 1、列舉你工作中遇到的IE6 BUG,談談解決方案 a.雙倍邊距bug: 例如:當給父元素內第一個浮動元素設置margin-left或margin-right的時候,margin屬性會加倍,

Spring Boot幹貨系列配置文件解析

set test profile ava java prefix 標註 了解 pre Spring Boot:配置文件解析 前言 上一篇介紹了Spring Boot的入門,知道了Spring Boot使用“習慣優於配置”(項目中存在大量的配置,此外

從0開始的微服務架構如何快速體驗微服務架構?

常常 原來 人員 google tty 打包 第三方 江湖 ces 雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就是很有借鑒意義的幹貨,要麽就是

《Kubernetes權威指南第2版》學習一個簡單的例子

stop 輸入 rtu gist 用戶名 server 遠程 dock netstat 1: 安裝VirtualBox, 並下載CentOS-7-x86_64-DVD-1708.iso, 安裝centOS7,具體過程可以百度。 2:開啟centOS的SSH, 步驟如下:

CentOS7.5Kubernets(k8s)1.12.2之安裝Helm

K8s安裝Helm注:charts倉庫如果用google的必須設定代理(比如squid),不需要的話可以用阿里的charts倉庫1、下載helmHelm命令下載地址:https://github.com/helm/helm/releases連結:https://pan.baidu.com/s/15Je7HwU

Android 開發安卓常用5大布局方式

一、Android中常用的5大布局方式有以下幾種: 1.線性佈局(LinearLayout):按照垂直或者水平方向佈局的元件; 2.幀佈局(FrameLayout) :元件從螢幕左上方(0,0)佈局元件; 3.相對佈局 (RelativeLayout) :相對其它元件的佈

2篇 Qt5基礎編寫Qt多視窗程式

  1、通過程式碼來設定按鈕的中文文字會覆蓋以前在設計模式設定的文字,(另外,如果大家以前學過Qt 4,那麼現在可能會激動地發現不用在使用setCodecForTr()等函式就可以直接顯示中文了)不過,在程式碼中直接使用中文字不是一個好的習慣,建議在編寫程式時使用英文,當程式完成後使用

從零開始學Socket連線服務端和客戶端

先了解一下執行緒問題,在Main函式裡就是主執行緒他能處理程式碼,而new Thread就是新開一個執行緒,他和主執行緒互不干預,但是主執行緒完了,他也完了。他完了,主執行緒沒事。   在上篇部落格裡,我們已經建立好了伺服器端和客戶端,但是他們倆還沒有聯絡,要把他們聯絡起來,就

Java 8 與併發

一、並行流與並行排序 Java 8中可以在介面不變的情況下,將流改為並行流,方便在多執行緒中進行集合中的資料處理。 1.1 使用並行流過濾資料 下面示例統計1~1000000內所有質數的數量。下面是一個判斷質數的函式: public class PrimeUtil {

day 16 - 2 內建函式練習

內建函式(二)練習 1、用map來處理字串列表,把列表中所有人都變成sb,比方alex_sbname=['alex','wupeiqi','yuanhao','nezha']   name=['alex','wupeiqi','yuanhao','nezha'] def func(n):

演算法優化學習維高斯濾波的引入

1.高斯分佈 1.1一維高斯分佈 高斯分佈又稱為正態分佈,是一種廣泛應用的概率分佈,一維高斯分佈比較常見,相關數學定義如下所示。 對於不同的均值和標準差,一維高斯分佈曲線如下,可以看出標準差越大麴線越平坦,分佈越平均;標準差越小,曲線越陡峭,分佈越不均勻。 1

JavaWeb+ServletAjax非同步登入註冊?Servlet+Json 資料互動

上一篇文章已經將Dao層搭建好了,所以只需要編寫jsp及servlet。 具體專案訪問GitHub:連結 一、登入 1. 登入介面(index.jsp) 需要匯入並載入 jquery.js檔案 <%@ page language="java" contentType="te

Spring學習之Spring三種裝配機制顯示裝配bean

  今天我們介紹一下Spring三種裝配機制中的另外兩種裝配方式:JavaConfig和XML配置,這兩種方式區別於自動化裝配方式都屬於顯示裝配。 1、Java程式碼裝配bean 首先,我們通過在Config類中使用@Bean註解來宣告bean; @Bean註

如何做一名優秀的博士生方法論的轉變

【序: 本文主要來自我在2008年清華大學研究生入學教育裡一次2.5小時的講座,又綜合了一些隨後的思考和總結。在那次講座中,我一再強調,我的目的不是要求研究生完全按照我講的去做,而是希望從根本上衝擊、振盪一下研究生的思考角度,啟發大家找到最適合自己的成才之路。本文比較長,將分四部分陸續在部落格上發表

阿里雲伺服器的web專案釋出之路雲伺服器tomcat及JDK的安裝

雲伺服器tomcat及JDK的安裝(步驟詳細,要軟體的留言喲) **準備工作:**遠端連線工具(xshell或者putty),tomcat和JDK壓縮包 首先購買的伺服器你需要知道你伺服器的使用者名稱(root)和密碼(自己設定) 密碼設定的位置: 下載相關的伺服器遠端連線軟體(xsh

OAuth 2.0系列教程 綜述

作者:Jakob Jenkov   譯者:林浩    校對:郭蕾 如引言所說的,OAuth 2.0是一個能夠使應用彼此訪問資料的開放授權協議,這裡我們將闡述該協議是怎麼工作的以及規範中提到的概念。該圖說明了整個授權過程: OAuth 2.0怎樣被用來在應用間共享資料的例子 第一步,使用者訪