# 说在前面

CQHttp 很强大,所以为什么需要从代码编译出插件呢,因为为了下断点啊,从 Release 下载的插件没有符号,没办法调试啊,插件莫名其妙就炸了, C++ 的错误信息又那么难懂,不看代码怎么排错啊呜呜呜呜
(ps: 如果你想写一个酷 Q 插件的兼容框架,就拿 CQHttp 做验证的例子吧,它可以很好的检验你框架的启动流程是否符合标准

# 环境需求

  • Git
  • MSVC v141
  • Visual Studio 2019

# 拉取代码

1
2
3
4
git clone https://github.com/richardchien/coolq-http-api.git
cd coolq-http-api
git submodule init
git submodule update

# 安装依赖

文本复制自 CQHttp 的 Readme, 文件分流到蓝奏云
然后,从 这里 下载 vcpkg-export-20191012.zip(也就是预编译的依赖),并解压到当前工程目录,确保工程目录结构如下:

coolq-http-api
├── ...
├── src
├── vcpkg-export-20191012
│     ├── installed
│     ├── scripts
│     └── .vcpkg-root
├── CMakeLists.txt
└── ...

# 编译程序

一般的 PowerShell 都有对脚本运行的限制,为了安全考虑,这里还是不将此限制打开

  1. 键入 Win+R 打开运行,输入 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned 来打开一个解除脚本限制的 PowerShell 实例
  2. 输入 cd 拉取代码的文件夹
  3. 输入 .\scripts\generate.ps1 Debug 生成 CMake 目录,大约不到十秒
  4. 输入 .\scripts\build.ps1 Debug 执行编译流程,大约在一分钟

创建CMake目录
如果你运气好,不报错的话 , 不过大概也不太可能,CQHttp 代码已经成功编译,并且已经得到了符号文件,此贴终结 (草)

# 错误排除

要是真这么简单我为什么还要水这一篇 (草), 实际上编译流程应该会报错,下文会详细介绍报错的解决方案
在输入 .\scripts\build.ps1 Debug 后,忽略中间产生的各种信息,会出现两行红字,并最终显示 CMake 构建失败
编译错误
发生在 fmt.lib 库文件中,出现 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” 的含义是:解决方案为 Debug 模式,而引用了一个 Release 模式的库文件,所以解决方案就很明了了:解决这个引用错误的文件,更改为 Debug 模式的文件

  1. 进入 build\debug 文件夹,打开其中的 coolq-http-api.sln 解决方案文件
  2. 选择 app 项目并按 Alt+Enter , 打开项目属性
    选择app项目
  3. 依次点击 链接器-输入-附加依赖项-右侧下箭头-编辑
    编辑依赖
  4. 寻找 fmt.lib
    寻找
  5. 进入这个依赖库目录寻找是否有 dbeug 版本的 fmt.lib
    dbeug版本的fmt.lib
  6. 将这个库替换成为 debug 版本的,点击 全部保存 ,应该就可以正常编译了
    debug版库

再次尝试编译,输入 .\scripts\build.ps1 debug , 可以看到编译成功了
编译成功

# 符号以及联合调试

其实绕了这么大一圈只是为了带符号的 dll 之后就一上午加半个下午过去了,接下来来介绍 C# 代码与 C++ 代码联合调试的方法

  1. 将 CQHttp 的 dll 以及 pdb 符号文件拷贝到需要进行调试的地方
  2. 打开 C# 的解决方案
  3. 添加一个 现有项目
    添加现有项目
  4. 打开刚才编译时用到的 debug 目录,选择 app.vcxproj
    添加app项目
    这是添加项目成功之后的样子
    添加后的样子
  5. 在需要运行的 C# 项目上,按下 Alt+Enter , 依次点击 调试-调试程序引擎-启用本地代码调试
    启用本地代码调试
  6. 之后就可以挂断点进行调试了
    断点调试

# 适应 CQHttp 时需要注意的点

更新于 阅读次数