作者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/cn.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