作者name2name2 (yang~hi)
看板PCman
標題[心得] PCman 程式建置 初步嘗試
時間Wed May 20 22:48:11 2020
最近有對於PCman再嘗試一次建置程式專案,
在此滿之前我有試過去建置對更舊版本的PCman去建置,
當時最後只有在xp環境成功跑起來,但使用的是VC++ 6.0,
在對於C++還不熟的情況下,加上VC++ 6.0的古早簡易的功能,
不如後來的VS2013~2017強大的功能來的方便,
更難以對整個專案進行摸索,所以後來就沒再碰了
後來這篇出來之後
#1PFY6t8- (PCman) 覺得很厲害竟然讓他在2017又活起來了
就決定再來試試看
最近的嘗試有發在Github的Issue
https://github.com/pcman-bbs/pcman-windows/issues/48
不過因為我是C++超不熟,所以都用拼湊的,所以單純再紀錄一下又讓他跑起來成功一次
之後如果有後續我可以再來分享看看
如果前幾個月活躍修改的大大願意撥空可以接受發問和提供簡單的教學,當然好,
不然我目前是新新手+自己google學習而已
當然C++博大精深,要一直探索問下去可能會太久
可能偶爾可以給發問回答一下我覺得也很好
--
目前也是抽空來試的,不保證能經常花時間在這個issue,假若有空有閒就可以再試一下。
--
以下複製貼上我在issue裡的貼文文字
name2name2 commented on 31 Mar ‧
Hi, recently I try to build this project again but got error, hope someone
can help. I clone this project last few days, and have learned to install and
use vcpkg , and installed many packages, also google keyword to solve many
errors and problems such as error related to Project > Properties > Linker >
Additional Dependencies settings.
Now I got an error that after google I still can't solved:
Severity Code Description Project File Line Suppression
State
Error LNK2019 unresolved external symbol "__declspec(dllimport) public:
class Concurrency::task<class
web::websockets::client::websocket_incoming_message> __thiscall
web::websockets::client::details::websocket_client_task_impl::receive(void)"
(__imp_?receive@websocket_client_task_impl@details@client@websockets@web@@QAE?AV?$task@Vwebsocket_incoming_message@client@websockets@web@@@Concurrency@@XZ)
referenced in function "public: class Concurrency::task<class
web::websockets::client::websocket_incoming_message> __thiscall
web::websockets::client::websocket_client::receive(void)"
(?receive@websocket_client@client@websockets@web@@QAE?AV?$task@Vwebsocket_incoming_message@client@websockets@web@@@Concurrency@@XZ)
Combo \pcman-windows\Combo\Websocket.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public:
void __thiscall
web::websockets::client::details::websocket_client_task_impl::close_pending_tasks_with_error(class
web::websockets::client::websocket_exception const &)"
(__imp_?close_pending_tasks_with_error@websocket_client_task_impl@details@client@websockets@web@@QAEXABVwebsocket_exception@345@@Z)
referenced in function
__catch$??R<lambda_6faaa49c60b61750ef16c4ff707b1ae7>@@QBE@V?$task@X@Concurrency@@@Z$0
Combo \pcman-windows\Combo\Websocket.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public:
__thiscall
web::websockets::client::details::websocket_client_task_impl::websocket_client_task_impl(class
web::websockets::client::websocket_client_config)"
(__imp_??0websocket_client_task_impl@details@client@websockets@web@@QAE@Vwebsocket_client_config@234@@Z)
referenced in function "public: __thiscall std::_Ref_count_obj<class
web::websockets::client::details::websocket_client_task_impl>::_Ref_count_obj<class
web::websockets::client::details::websocket_client_task_impl><class
web::websockets::client::websocket_client_config>(class
web::websockets::client::websocket_client_config &&)"
(??$?0Vwebsocket_client_config@client@websockets@web@@@?$_Ref_count_obj@Vwebsocket_client_task_impl@details@client@websockets@web@@@std@@QAE@$$QAVwebsocket_client_config@client@websockets@web@@@Z)
Combo \pcman-windows\Combo\Websocket.obj 1
Error LNK2019 unresolved external symbol _CONF_modules_unload
referenced in function "public: __thiscall
boost::asio::ssl::detail::openssl_init_base::do_init::~do_init(void)"
(??1do_init@openssl_init_base@detail@ssl@asio@boost@@QAE@XZ) Combo
\pcman-windows\Combo\Websocket.obj 1
Error LNK2019 unresolved external symbol _ERR_reason_error_string
referenced in function "public: virtual class std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> > __thiscall
boost::asio::error::detail::ssl_category::message(int)const "
(?message@ssl_category@detail@error@asio@boost@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)
Combo \pcman-windows\Combo\Websocket.obj 1
I guess this error is related to cpprest because in Websocket.cpp it includes
<cpprest/ws_client.h>, but I have add lib cpprest_2_10.lib to Linker >
Additional Dependencies but still show these errors.
How to solve the Error? all the packages such as cpprest and boost are
latest, installed by vcpkg.
Can you build success recently? Thank you very much!
---------------------------------------------------------------
name2name2 commented 22 minutes ago ‧
對C++還不熟悉,這幾天又再發起一波嘗試,經過辛苦的網路搜尋,本來還想說已經盡力
了還是沒招@@,打算去相關看板發問了,好在後來有搜到關鍵的相關好心大大教學,總算
找到原來 unresolved external symbol 是一種固定常見的C++錯誤訊息,跟 C++ 有
declaration 但沒有definition 有關,另外也對於其他遇到的問題大量搜尋試誤解決,
也有初步開始使用CMake,目前拼拼湊湊已經可以成功讓Lite專案跑起來,但拼湊的過程
還差一點,websocket_client_task_impl 還沒透徹解決,差一點繼續摸索中。之後如果
真的完全跑起來了,可能打算看用什麼方式分享過程,讓新接觸的人也可以建置成功跑起
來,也可以跟目前repo的前面貢獻者交流一下我的方式和觀念有沒有可以改進的地方,我
算是還是C++新新手。但是要等我真的把最後的websocket_client_task_impl透徹解決,
還不確定能不能完全通這一段。不保證要花多少時間和最後能不能成功。我也是在很少可
用的時間裡抽出時間來試的,不保證能經常花時間在這個issue,假若有空有閒就可以再
試一下。
https://i.imgur.com/68zihze.png
---
--
目前也是抽空來試的,不保證能經常花時間在這個issue,假若有空有閒就可以再試一下
--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.140.221.117 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/PCman/M.1589986096.A.2BF.html
※ 編輯: name2name2 (223.140.221.117 臺灣), 05/20/2020 22:48:54
1F:推 holishing: 推 05/21 01:18
2F:推 holishing: 現在可以在 vs2017/vs2019 順利編譯了, 感謝原 po 的 05/23 22:47
3F:→ holishing: 文件整理,目前放在 05/23 22:48
5F:推 holishing: 這樣有 Windows 裝得了 Visual Studio 的人應都能試了 05/23 23:00
在這邊紀錄一下一開始自行找出的步驟,
其中包含CMake的使用,提供給對CMake有興趣的朋友參考
後面h大發現並整理出比較簡易操作的版本請參考wiki
https://github.com/pcman-bbs/pcman-windows/wiki/Building_PCMan
以下是有使用CMake手動產生相關dll的建置PCMan步驟:
PCMan程式專案建置和執行:逐步解說
----------------------------------
1. 安裝 Visual Studio 2017 (Community 即可)
。 請至官方網站下載:
https://www.visualstudio.com/
。 目前最新版本是Visual Studio 2019 應該也可以
。 安裝過程詢問到要安裝那些模組時,將C++有關的套件選項都勾起來安裝,依照安裝
程式導引安裝完成
2. 建立一個本機資料夾可以放git repository,以下將資料夾路徑代稱為
本機Git資料
夾
3. git clone pcman-windows (
https://github.com/pcman-bbs/pcman-windows.git)
到
本機Git資料夾\pcman-windows
。 可以用git的clone指令,或者git的相關GUI軟體的clone功能
4. git clone vcpkg (
https://github.com/Microsoft/vcpkg) 到
本機git資料夾
\vcpkg
。 clone完成後,依照官方頁面教學,點兩下執行 vcpkg\bootstrap-vcpkg.bat
。 執行完成後會出現 vcpkg\vcpkg.exe
。 開啟cmd,執行
cd /d 本機Git資料夾\vcpkg,再執行
vcpkg integrate install
。 正確會印出訊息 Applied user-wide integration for this vcpkg root.
。 如果出現 Warning: integration was not applied ,則將整個vcpkg資料夾複
製到 C:\ ,再執行
cd /d C:\vcpkg ,再執行
vcpkg integrate install 。後面步驟的vcpkg路徑都要改成 C:\vcpkg [註1]
5. 使用vcpkg安裝套件
。 將cmd的路徑保持在
本機Git資料夾\vcpkg,以下開始用cmd安裝x86版本的
package
。 執行
vcpkg install cpprestsdk:x86-windows
。 執行
vcpkg install boost:x86-windows,裝的套件比較多,耐心等候大約半小時
安裝完成
。 執行
vcpkg install websocketpp:x86-windows
5. git clone cpprestsdk (
https://github.com/microsoft/cpprestsdk) 到
本機git資料夾\cpprestsdk
6. 安裝CMake
。 前往
https://cmake.org/download/ , 下載Latest Version中適用於Windows x64
的msi檔
。 執行msi檔,跟隨安裝程式導引完成CMake安裝
7. 取得cpprestsdk相關的dll lib檔
。 cmd 執行
cd /d 本機Git資料夾\cpprestsdk
。 執行
mkdir build.x32v141 [註2]
。 執行
cd build.x32v141
。 執行
"C:\Program Files\CMake\bin\cmake.exe" ../Release -A Win32
-DCMAKE_TOOLCHAIN_FILE=本機Git資料夾/vcpkg/scripts/buildsystems/vcpkg.cmake
。 正確完成會印出訊息
Build files have been written to: 本機Git資料夾
/cpprestsdk/build.x32v141
。 用 visual studio 開啟 \build.x32v141\cpprestsdk.sln
。 等待 visual studio 載入專案,左下角如有 Parsing Include ... Scanning
Include ... 訊息,耐心等候直到左下角訊息停止變動,出現 就緒Ready 訊息
。 在 cpprest 專案 > 右鍵 > Build(建置) ,等待建置成功
。 建置成功後,會有一些.dll .lib等等檔案輸出到
\build.x32v141\Binaries\Debug,全部的檔案有cpprest141_2_10d.dll
libcrypto-1_1.dll libssl-1_1.dll zlibd1.dll cpprest141_2_10d.exp
cpprest141_2_10d.ilk cpprest141_2_10d.lib cpprest141_2_10d.pdb
。 將這些檔案複製到
本機Git資料夾\pcman-windows\Lite 和
本機Git資料夾
\pcman-windows\Combo
8. 設定/建置PCMan專案
。 用 visual studio 開啟
本機Git資料夾\pcman-windows\PCMan.sln
。 開啟後等待 visual studio 載入,等到左下角訊息不再變動
。 在 Combo 專案 > 右鍵 > Properties(屬性) > Linker > All Options > 設定頁面
往上滾動 > Additional Dependencies > 在現有參數後方加上
;本機Git資料夾
\pcman-windows\Combo\cpprest141_2_10d.lib , 小心不要覆蓋掉全部的值(發現蓋掉
全部的值可按Esc還原),是加在現有值的後方
。 在 Combo 專案 > 右鍵 > Build(建置) ,等待建置成功
。 在 Lite 專案 > 右鍵 > Properties(屬性) > Linker > All Options > 設定頁面
往上滾動 > Additional Dependencies > 在現有參數後方加上
;本機Git資料夾
\pcman-windows\Lite\cpprest141_2_10d.lib , 小心不要覆蓋掉全部的值(發現蓋掉全
部的值可按Esc還原),是加在現有值的後方
。 在 Lite 專案 > 右鍵 > Build(建置) ,等待建置成功
9. 執行 PCMan
。 在 Lite 或 Combo 專案 > 右鍵 > Set as StartUp Project(設定為起始專案) >
按下 F5 , 即可執行出現PCMan的程式畫面
[註1] : 我原本先把vcpkg裝在E:\ ,然後跑integrate install會出現Warning:
integration was not applied訊息,雖然看到Warning先繼續安裝相關的套件完成,安
裝完成後發現在visual studio裡面的cpp檔相關的#include還是會出現紅線錯誤。後來
搜尋
https://github.com/Microsoft/vcpkg/issues/5956 提到
I have reinstalled vcpkg directly to the c-drive and now it is working, even
if I don't know why. Thank you for the support.,我改放到C:\底下,重新執行
integrate install就得到Applied user-wide integration for this vcpkg root.訊息,cpp檔裡面的 #include 也正常了。但是刪掉vcpkg再重裝在E:\,又沒問題了。
[註2] : 從
https://github.com/microsoft/cpprestsdk/wiki/How-to-build-for-Windows 學到,裡
面是x64,另外搜尋一些文章得知參數改成Win32就可以輸出為32位元的版本
※ 編輯: name2name2 (36.226.13.6 臺灣), 05/24/2020 22:19:05
6F:推 holishing: 你上面那個步驟太麻煩了,不需要手動裝 cpprestsdk 05/25 04:15
7F:→ holishing: 反正已經在上面的 github wiki 連結整理了,就參考那個 05/25 04:16
8F:→ holishing: 理論上 vcpkg 都幫你完成一堆編譯步驟包括幫你跑完那些 05/25 04:17
9F:→ holishing: cmake 之類的編譯指令了 05/25 04:17
10F:推 holishing: 手動跑會造成設定過於複雜且容易出錯 05/25 04:28
11F:推 tonyhsie: 推 06/11 11:11
12F:推 OldYellowDog: 推 06/12 22:01