Windows 上 sentry-native v0.7.2 版本的使用

在我建议 sentry-native 社区添加 content: gzip 功能,并提交了一个 PR 帮助他们完成后,终于在 v0.7.2 中添加了该功能

https://github.com/getsentry/sentry-native/releases/tag/0.7.2 

不过实际中使用与旧版本存在一些差距,主要在于 zlib 库的引用,所以记录下差异的地方和解决的方法

sentry-native 是使用 CMake-Gui 完成构建的,0.7.2 的版本多了 SENTRY_TRANSPORT_COMPREESION 选项

当我们勾选该选项后就是默认使用 gzipped_with_compression 函数来压缩请求消息,参考下面部分源码

#ifdef SENTRY_TRANSPORT_COMPRESSION
    char *compressed_body = NULL;
    size_t compressed_body_len = 0;
    compressed = gzipped_with_compression(
        body, body_len, &compressed_body, &compressed_body_len);
    if (compressed) {
        if (body_owned) {
            sentry_free(body);
            body_owned = false;
        }
        body = compressed_body;
        body_len = compressed_body_len;
        body_owned = true;
    }
#endif

所以问题来了,sentry 要引用 zlib 库,但是它不能引用 crashpad 中的 crashpad_zlib 库,因为社区建议 sentry 和 crashpad 保持独立,两者尽量不耦合,故我们需要使用到系统的库=》zlib

那我们从哪找到 zlib 库呢,首先排除 GNUWIN32 提供的 zlib 库,原因是版本太老了

为什么我要提到 GNUWIN32 这个网站呢,因为国内技术博客提到 zlib 本地集成的解决方法中,很多都会让用户去该网站下载现成的 msi 文件去下载安装

实际使用当中,当你的项目使用到较新的 api,就会提示符号文件找不到,所以不建议使用过时的 zlib 库

最好的办法就是我们手动编译生成适合项目的 zlib 库,这里我使用的是 zlib-1.2.11 版本

源码地址:https://github.com/madler/zlib/releases/tag/v1.2.11

下载到本地后,打开 x86 Native Tools Command Prompt for Vs 20xx 命令框,并在其中 cd 到源码目录下,使用 nmake 快速编译生成

nmake -f win32/Makefile.msc

参考:zlib在Linux和windows中的使用

最后,在 CMake-Gui 中勾选 Advanced 框,并设置 zlib 头文件和静态库路径,如果不设置 zlib 路径,就会出现找不到 zlib 库的错误

解决方法;

 

重新 Configure 就会发现配置正常了

补充:

编译过程中可能会出现“Unresolved external symbol __except_handler4_common" in Visual Studio XXX” 这样的错误

这种问题一般就是 Code Generation/Runtime Library 的生成方法不匹配导致的

解决方法:所有的工程使用相同的 Runtime Library 编译,比如我这边 Release 下使用 MT

参考:"Unresolved external symbol __except_handler4_common" in Visual Studio 2015

posted @ 2024-05-22 19:30  strive-sun  阅读(20)  评论(0编辑  收藏  举报