12CrazyPaul21/WxBox

桌面端微信机器人

C++LuaMesonBatchfileQMLShellOther
This is stars and forks stats for /12CrazyPaul21/WxBox repository. As of 04 May, 2024 this repository has 135 stars and 24 forks.

WxBox 主要功能 WeChat进程实例多开; 消息防撤回; 监控账户生命周期【登录、注销、退出PC客户端】; 检查PC微信是否处于登录状态; Plugin触发PC端退出登录; 获取登录账户的Profile; 获取包括群聊在内的所有联系人信息【只获取昵称、备注、wxnumber和wxid】; 昵称、wxnumber和wxid之间的相互转换; 接管WeChat原始消息和处理过的消息; 接管WeChat发送文本消息; Plugin主动执行发送文本消息、文件、图片,对于群聊可以指定@列表。可以指定发送的目标和内容; 过滤接收到的消息【原始消息拦截事件中】; 替换接收到的消息【原始消息拦截事件中】,可以替换发送者、消息内容,对于群聊可以替换talker; 通过WxBox或者手机端WeChat的“文件传输助手”向PC WeChat客户端发出执行Plugin命令的指令; 自定义纯文本和二进制类型的Plugin。 Plugin预定义wxbox模块提供的部分API接口 WxBox的核心功能在Plugin上,上面的所有功能都可以在自定义的Plugin中调用,而Plugin可以通过WxBox和filehelper来调用。 ​ WxBot里面预定义了一个wxbox模块,它提供了一些API接口,这些API包含了上面还有之外的功能,完整的wxbox模块API可以看plugins目录下的wxbox_apis.txt文件,下面列出部分: >>wxbox.version查看wxbox的版本 >>wxbox.help查看wxbox命令帮助,它会给文件传输助手发送一个wxbox_apis.txt文件 >>wxbox.get_phone_test_case如果处于登录状态的话,会给手机上的文件传输助手发送所有手机的测试用例 >>wxbox.snap向filehelper发送一个桌面系统所有显示器拼接的“载图” >>wxbox.snap_main_monitor向filehelper发送一个桌面主Monitor的“载图” >>wxbox.info、>>wxbox.warning、>>wxbox.error向WxBox发送不同Level的日志 >>wxbox.shell在PC系统上执行有权限执行的所有类型的shell命令【*】,可以通过它执行关机、打开程序、图片等指令 >>wxbox.msgbox给PC弹出一个对话框,用来提示消息的 >>wxbox.speak让PC播放一段指定文本的语音 >>wxbox.lock_screen让PC锁屏 >>wxbox.list_drivers列出PC系统上所有的硬盘驱动器盘符 >>wxbox.list_files列出PC系统上指定文件夹目录下的所有文件和文件夹 >>wxbox.download把PC上指定的文件通过filehelper传输到手机上,大小限制跟WeChat发送文件大小的限制一样,听说最大是1GB,但是没测试过 >>wxbox.uninject_wxbot卸载PC上当前用户的WxBot模块 >>wxbox.exit_wxbox关闭PC上的WxBox >>wxbox.logout让PC上的WeChat退出登录 >>wxbox.nickname_to_wxid昵称转为wxid >>wxbox.wxid_to_wxnumber从wxid转为wxnumber >>wxbox.chatroom_wxid获取群聊的roomWxid >>wxbox.send_text_to_filehelper向filehelper发送文本消息 >>wxbox.send_picture_to_filehelper向filehelper发送图片 >>wxbox.send_file_to_filehelper向filehelper发送文件 >>wxbox.send_text向指定wxid联系人发送文本消息 >>wxbox.send_picture向指定wxid联系人发送图片 >>wxbox.send_file向指定wxid联系人发送文件 >>wxbox.send_text_with_wxnumber向指定wxnumber联系人发送文本消息 >>wxbox.send_picture_with_wxnumber向指定wxnumber联系人发送图片 >>wxbox.send_file_with_wxnumber向指定wxnumber联系人发送文件 >>wxbox.send_text_to_chatroom向指定群聊发送文本消息,消息后面可选带@列表 >>wxbox.send_picture_to_chatroom向群聊发送图片 >>wxbox.send_file_to_chatroom向群聊发送文件 >>wxbox.chatroom_notiry在群聊上@一部分人 >>wxbox.chatroom_notiry_all在群聊上@所有人 第三方依赖 ​ 注意:以下部分库存在编译好的版本或者我们自己编译过的Windows版本放在这个仓库上:https://gitee.com/phantom27/wxbox-public-storage gRPC - v1.41.1 protobuf - v3.17.3 frida-gum(弃用) TitanEngine(弃用) Qt5 spdlog - v1.9.2 meson+ninja - >=v0.60.2 cmake pkg-config lua - v5.4.3 googletest - v1.11.0 yaml-cpp - v0.7.0 i18n支持 ​ 项目中以简体中文为原始语言,如果加入新的文本还有翻译,需要手动更新assets/translations/下的zh_cn.ts和en.ts,可以配合Linguist做调整,然后执行以下命令,生成对应的qm文件,并touch wxbox.qrc使编译器知道资源文件更新了(如果执行githooks/setup_hook可以安装一个git的pre-commit钩子,在commit前会自动检查更新) # Windows .\scripts\update_i18n.bat # Mac OS ./scripts/update_i18n ​ 另外由于采用的原始语言是英文,而在一些编辑器上,特别是中文环境的Visual Studio IDE上,默认的编码可能用的是gbk,直接使用中文文本这就有可能导致跟ts文件的对不上,所以在非.ui文件上,也就是在.cpp或者.h上的文本尽量使用英文,然后在zh_cn.ts上转成中文,zh_cn.ts和en.ts用的都是utf8。 ​ 或者用转义的方式(utf8一般一个汉字三个字节)也可以,例如: QMessageBox::information(this, tr("Title"), tr("\345\205\263\344\272\216 WxBox")); 构建方法 ​ 首先需要安装meson+ninja构建工具,可以到以下路径下载:https://github.com/mesonbuild/meson/releases。 ​ spdbuf需要cmake构建工具。 ​ 编译器需要C++17以上标准。 ​ 构建路径必须包含在build里面(不管是debug还是release版本的),ninja为backend使用build/debug和build/release,vs为backend使用build/vsdebug和build/release,mac用xcode构建的话使用build/xcodedebug和build/xcoderelease 关于构建时出现的Warning ​ 在编译时,部分第三方库有非常多的Warning,这些全部忽略它,但是不关闭这些警告。但是主项目构建时出现的所有Warning都要重新检查,对主项目的所有Warning零容忍 Qt SDK环境路径 ​ 在Windows中要把qmake的路径加入Path中,否则meson识别不到Qt5 # 下面是一个msvc2017构建kit路径的例子,注意必须是32位的版本 F:\Qt\Qt5.14.2\5.14.2\msvc2017\bin ​ Qt SDK下载路径:https://download.qt.io/archive/qt/,官方镜像列表:https://download.qt.io/static/mirrorlist/,尽量使用Qt 5.11~ Qt 5.15版本的SDK。 Qt依赖处理 ​ 在Windows下使用windeployqt,Mac OS下使用macdeployqt,这两个都是Qt官方的工具。 lua wrap补丁 ​ meson官方的lua wrap生成的是动态库,但是我们需要的是静态库,所以对meson官方的lua_5.4.3-1 wrap打了个补丁,修改为生成静态库。这个直接以zip包方式放在仓库上,wrap下回来的包使用的是这个。 # 打补丁的位置是lua-5.4.3/meson.build # 补丁内容如下: index a9c4d56..2004cfb 100644 --- a/meson_original.build +++ b/meson.build @@ -49,7 +49,7 @@ if get_option('line_editing') endif # Targets. -lua_lib = library('lua', +lua_lib = static_library('lua', 'src/lapi.c', 'src/lauxlib.c', 'src/lbaselib.c', @@ -83,8 +83,6 @@ lua_lib = library('lua', 'src/lvm.c', 'src/lzio.c', dependencies: lua_lib_deps, - version: meson.project_version(), - soversion: lua_versions[0] + '.' + lua_versions[1], 构建依赖 ​ 由于只有gRPC构建出来比较麻烦,所以这里只记录gRPC的构建方法。另外在编译gRPC的时候protobuf也一起编译了,所以不需要另外编译protobuf了。 gRPC构建方法 ​ 如果在Mac OS环境下能用brew安装gRPC的dev包,那么就不需要,对于Windows已经编译好了一份Debug和一份Release版本的了,它们将放在仓库上,并且已经给gRPC写了一个meson的wrap,在使用meson构建时将会自动下载。(note:这个也可以用vcpkg来构建,不过版本相对有点旧,所以不用vcpkg的port) # 克隆gRPC git clone --recurse-submodules -b v1.43.0 https://github.com/grpc/grpc # 如果克隆下来后因为网络原因导致一些submodules未下回来,可以先把grpc克隆回来,然后后面再用下面的命令来把submodule拉回来 git submodule init git submodule update # 对于Windows 需要下载依赖 sudo choco install nasm # 对于Mac OS 需要下载以下依赖 brew install autoconf automake libtool pkg-config # 另外注意,这是用cmake来构建configure的所以cmake在两个平台下都需要 # Windows环境下编译gRPC Debug版本(先切到gRPC仓库的根目录后执行下面命令) mkdir -p cmake/build/debug & cd cmake/build/debug cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/debug ../.. nmake nmake install # Windows环境下编译gRPC Release版本(先切到gRPC仓库的根目录后执行下面命令) mkdir -p cmake/build/debug & cd cmake/build/debug cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/release ../.. nmake nmake install # Mac OS环境下编译gRPC Debug版本(先切到gRPC仓库的根目录后执行下面命令) mkdir -p cmake/build/debug & cd cmake/build/debug cmake -G -DCMAKE_BUILD_TYPE=Debug -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/debug ../.. make -j make install # Mac OS环境下编译gRPC Release版本(先切到gRPC仓库的根目录后执行下面命令) mkdir -p cmake/build/debug & cd cmake/build/debug cmake -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/release ../.. make make install gRPC引用注意 ​ gRPC在install后是会打包好给pkg-config用的pc文件的,但是由于生成的lib文件非常的多,执行一次pkg-config搜索非常的慢,所以项目中用的方法是,调用一次pkg-config然后把参数记录下来,直接写进meson的wrap中。 # 下面是在Windows环境下执行的pkg-config,PKG_CONFIG_PATH需要根据实际情况修改 PKG_CONFIG_PATH=/g/Tutorial/meson/testgrpc/grpc/lib/pkgconfig ./pkg-config.exe grpc++ --cflags --libs # 结果如下: /W3 /DNOMINMAX /DWIN32_LEAN_AND_MEAN /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /D_ENABLE_EXTENDED_ALIGNED_STORAGE /bigobj /wd4005 /wd4068 /wd4180 /wd4244 /wd4267 /wd4503 /wd4800 -IG:/Tutorial/meson/testgrpc/grpc/include -ignore:4221 -LG:/Tutorial/meson/testgrpc/grpc/lib -lgrpc++ -lgrpc -laddress_sorting -lre2 -lupb -lcares -lz -lgpr -labsl_statusor -lssl -lcrypto -labsl_hash -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_city -labsl_low_level_hash -labsl_random_distributions -labsl_random_seed_sequences -labsl_random_internal_pool_urbg -labsl_random_internal_randen -labsl_random_seed_gen_exception -labsl_random_internal_randen_hwaes -labsl_random_internal_randen_slow -labsl_random_internal_randen_hwaes_impl -labsl_random_internal_platform -labsl_random_internal_seed_material -labsl_status -labsl_cord -labsl_cordz_info -labsl_cord_internal -labsl_cordz_functions -labsl_cordz_handle -labsl_exponential_biased -labsl_synchronization -labsl_bad_optional_access -labsl_str_format_internal -labsl_graphcycles_internal -labsl_stacktrace -labsl_symbolize -labsl_time -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_civil_time -labsl_strings -labsl_time_zone -labsl_strings_internal -labsl_int128 -labsl_throw_delegate -labsl_base -labsl_spinlock_wait -labsl_bad_variant_access -labsl_raw_logging_internal -labsl_log_severity # 处理过之后编译参数整理为: ['/DNOMINMAX', '/DWIN32_LEAN_AND_MEAN', '/D_CRT_SECURE_NO_WARNINGS', '/D_SCL_SECURE_NO_WARNINGS', '/D_ENABLE_EXTENDED_ALIGNED_STORAGE', '/bigobj', '/wd4005', '/wd4068', '/wd4180', '/wd4244', '/wd4267', '/wd4503', '/wd4800'] # 依赖的静态库文件整理如下(这里还实际调试把漏掉的补上了): ['grpc++', 'grpc', 'address_sorting', 're2', 'upb', 'cares', 'zlib', 'gpr', 'absl_statusor', 'ssl', 'crypto', 'absl_hash', 'absl_raw_hash_set', 'absl_hashtablez_sampler', 'absl_city', 'absl_low_level_hash', 'absl_random_distributions', 'absl_random_seed_sequences', 'absl_random_internal_pool_urbg', 'absl_random_internal_randen', 'absl_random_seed_gen_exception', 'absl_random_internal_randen_hwaes', 'absl_random_internal_randen_slow', 'absl_random_internal_randen_hwaes_impl', 'absl_random_internal_platform', 'absl_random_internal_seed_material', 'absl_status', 'absl_cord', 'absl_cordz_info', 'absl_cord_internal', 'absl_cordz_functions', 'absl_cordz_handle', 'absl_exponential_biased', 'absl_synchronization', 'absl_bad_optional_access', 'absl_str_format_internal', 'absl_graphcycles_internal', 'absl_stacktrace', 'absl_symbolize', 'absl_time', 'absl_debugging_internal', 'absl_demangle_internal', 'absl_malloc_internal', 'absl_civil_time', 'absl_strings', 'absl_time_zone', 'absl_strings_internal', 'absl_int128', 'absl_throw_delegate', 'absl_base', 'absl_spinlock_wait', 'absl_bad_variant_access', 'absl_raw_logging_internal', 'absl_log_severity', 'libprotobuf', 'grpc++_reflection'] 更换为v1.41.1版本 ​ 由于v1.44.0版本使用时出现崩溃,所以换成了较老的1.41.1版本的gRPC. Windows下构建 # 在Visual Studio “x86”开发人员命令提示符执行以下命令 # 默认用的backend是ninja # !!! 构建路径必须包含在build里面 !!! meson setup build/release --buildtype release meson compile -C build/release Mac OS下构建 ​ ...... 关于测试 ​ 测试使用的框架是googletest,详细文档可以看:https://google.github.io/googletest/ # 执行测试(以debug版本为例子) meson compile -C build/debug meson test -C build/debug ​ 另外测试时要留意是否出现内存泄漏,对内存泄漏零容忍,必须避免。 禁用测试用例 ​ 可以通过宏开关来禁用某些测试用例,例如:禁用wxbox_utils的测试用例,可以用下面的方法reconfigure: meson build/vsdebug --reconfigure -Ddisable_wxbox_utils_test=true ​ 更多的开关可以看meson_options.txt 开发时的调试方法 ​ 开发调试不使用ninja作为backend,也不使用vscode作为编辑器,而是切为IDE,在Windows下用Visual Studio,在Mac OS下用xcode。另外下面Windows版本中,Visual Studio指定了wxbox为启动项目,在使用Visual Studio写测试用例时可以改为测试用例为启动项目。 安装git钩子 # 安装git pre-commit钩子,用于提交前自动完成代码风格化和更新i18n文件 ./githooks/setup_hook Windows下使用Visual Studio IDE来开发并调试 # 以Visual Studio为backend创建工程 meson setup build/vsdebug --buildtype debug --backend vs -Dbackend_startup_project=wxbox # 构建vs工程完成后,就可以打开build/vsdebug/WxBox.sln工程,然后把“wxbox@exe”修改为启动项目,接着就可以开发调试了 # 另外在IDE环境开发时,如果加入某些新源文件、修改的项目的配置,可以用以下命令reconfigure meson build/vsdebug --reconfigure Mac OS下使用xcode IDE来开发并调试 # 以xcode为backend创建工程 meson setup build/xcodedebug --buildtype debug --backend xcode 关于调试开发时一些dll、so查找路径的问题 ​ 如果是执行meson test进行测试话,在meson.build中已经配置好了PATH,但是如果像在Visual Studio中,调试开发运行时,dll、so的查找路径并没有通过meson.build中指定(meson目前应该是不支持的),通过脚本拷贝dll去工作目录的话没啥必要,所以就手动在Visual Studio中配置PATH吧。 ​ 这里的例子是包含wintools\bin和gRPC的bin目录: PATH=%PATH%;$(SolutionDir)..\..\wintools\bin;$(SolutionDir)..\..\subprojects\grpc-windows-x86-v1.41.1-dev-debug\bin ​ 多个dll查找路径用“;”隔开 代码风格 ​ 代码风格使用clang-format来统一,在命令行或在IDE(Visual Studio、xcode)上构建都要使用clang-format来把所有代码给格式化。 # 项目中已经为Windows还有Mac OS写了两个脚本,执行下面的Target就会调用了,另外-C不一定需要build/release meson compile -C build/release pretty_format ​ 另外Visual Studio是支持clang-format的,按下“;”分号或者保存,会触发Visual Studio自动应用项目根目录下的.clang-format文件,另外选中代码然后Ctrl+K,Ctrl+F也可以主动触发。并且也有一个LLVM官方的ClangFormat扩展:https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat配合。 ​ 不过Visual Studio 2015自带的clang-format版本比较老,有些开关不支持,会报错,所以这里把一些会报错的开关给注释掉了。 ​ 果执行githooks/setup_hook可以安装一个git的pre-commit钩子,在commit前会自动检查执行pretty_format。 ​ lint可以用cppcheck。 Plugins ​ WxBox使用lua来实现扩展,要注意的是,项目中的lua是C语言的构建版本而不是C++,所以“让出”、“错误处理”等操作用的是setjmp、longjmp来完成长跳转的,这会破坏栈帧结构,像在自定义封装的lua C函数内使用了C++的局部对象,那么是否能够调用对象的析构函数这是无法保证的,默认情况下,在Visual Studio编译环境由于编译器有补充了一些处理,所以可以调用析构函数,但是在Linux环境就不行。所以尽量不要在编写lua扩展的部分使用C++类对象。 plugins目录结构 +---plugins:存放所有包括纯文本和二进制的扩展; | +---common:存放“第三方”的lua库,比如:yaml库; | | ---libs:存放“第三方”的动态lua库 | +---libs:存放二进制的lua扩展 | | ---template:一个二进制扩展的模板,要想编写二进制的扩展可以参考这个模板。 | | ---subprojects | ---storage:供所有脚本存储配置信息、数据; Plugin类型 ​ 分为纯文本的扩展还有动态库的扩展,但WxBot识别为扩展并主动加载的只有plugins根目录下的纯文本lua,动态库类型还有其它第三方的lua都作为辅助的模块 热更新 ​ wxbot会监控plugins文件夹的变化,根据实际情况来加载、卸载或重新加载扩展 Plugin事件 ​ load、prereload和unload事件处理不接收参数,其它参数都会传递一个PluginEventModel,下面列出几个常用的事件 load:扩展加载事件,返回true表示初始化成功,返回false表示初始化失败; prereload:扩展重载前事件,没有返回值; unload:扩展卸载事件,没有返回值。 receive_text_message:微信接收文本消息,接收一个PluginEventModel,没有返回值 send_text_message:微信发送文本消息,接收一个PluginEventModel,没有返回值 Plugin任务超时机制 ​ 为了避免Plugin中出现死循环或者耗时过长的调用,所以Plugin有超时机制,如果一个调用超过设定的时间,那么会被强制结束任务并让出 Storage ​ lua可以自由的在storage文件夹内存储配置文件和数据文件,尽量每个模块对应一个文件夹,用wxbox.package_storage_path(plugin_name)来获取给扩展使用的存储目录,或者通过plugin.storage_path来获取。 引入第三方的lua库 ​ 纯文本的放在plugins/common根目录下,二进制的放进plugins/common/libs Plugin命令调用语法(BNF) ​ statement ::= prefixexp methodcall ​ prefixexp ::= “>>” ​ methodcall ::= method | method “:” arglist ​ method ::= methodname | modulename “.” methodname ​ arglist ::= expr {“,” expr} ​ expr ::= false | true | Numeral | LiteralString 可以执行Plugin命令的对象 ​ 可调用的模块只有wxbox的内部模块还有在plugins根目录下的纯本文lua扩展,不过全局的函数可以任意调用 ​ filehelper联系人发送的文本消息 ​ wxbox执行命令 交互式调用语法测试工具interact ​ 这里提供一个interact工具来在控制台下交互式的测试Plugin的调用语法 WxBox Plugin API ​ 看plugins\wxbox_module_apis.txt文件 Plugin例子 ​ 这个扩展的功能是,文件传输助手收到“关机”那么系统会定时2分钟后关机,“取消关机”就是取消这次关机任务,收到其它消息,在PC上会自动把文本语音播放出来。 helpme = declare_plugin('helpme') function helpme.handle_filehelper_text_message(event) message = event:message() if (message == '关机') then wxbox.shell('shutdown', '/s /t 120') elseif (message == '取消关机') then wxbox.shell('shutdown', '/a') else wxbox.speak(message) end end local text_message_handler = { ['filehelper'] = helpme.handle_filehelper_text_message } function helpme.receive_text_message(event) text_message_handler[event:wxid()](event) end install与打包方法 # ninja作为后端编译打包 meson setup build\release --buildtype=release meson compile -C build\release meson install -C build\release ​ 最终会被打包到build\dist\release目录下,build\install是一个过度路径,给meson执行install。这个项目里别用DESTDIR或者--prefix来重新指定打包路径,这不会生效。 ​ 打包最终会生成四个文件,分别是wxbox主体的.tar.xz和.zip包(它们内容相同),还有symbol的.tar.xz和.zip包。 ​ 另外别打包debug版本的,debug版有些运行时的依赖没有做处理。 运行环境 ​ Windows 7以上 CoreDump分析 ​ wxbox崩溃时会自动启动crashdumper进行转储,把源码和符号文件拷贝下来,在windbg上配置好源码和符号路径,然后执行 # windbg !analyze -v
Read on GithubGithub Stats Page
repotechsstarsweeklyforksweekly
weidai11/cryptoppC++ShellC4.2k01.8k0
amanusk/cairo-paradigm-ctfCairoOther10000
lambdaisland/witchcraft-workshopClojureShell38040
weavejester/cljfmtClojureShellBatchfile1.1k01160
rodriguezartav/rodriguezartav-siteCoffeeScriptRubyShell1000
phil294/AHK_X11CrystalAutoHotkeyMakefile646+390
joe-bell/loading-discoCSSTypeScriptHTML219+120
gskinnerTeam/flutter-wonderous-appDartC++HTML3.4k07840
wuba/FairPushyDartHTMLRuby2550350
rentpath/slack_queue_botElixirDockerfileShell2000