cyanray / mirai-cpp

本项目为 mirai-api-http 的 C++ 封装,方便使用 C++ 开发基于 mirai-api-http 插件。
GNU Affero General Public License v3.0
148 stars 37 forks source link

链接ssl和crypto库并#define CPPHTTPLIB_OPENSSL_SUPPORT后,Auth函数报错std :: alloc #58

Closed dbxxx-ac closed 3 years ago

dbxxx-ac commented 3 years ago
#ifndef CPPHTTPLIB_OPENSSL_SUPPORT
#define CPPHTTPLIB_OPENSSL_SUPPORT
#endif
....
    while (true) {
        try {
            std :: cout << "[INFO] Authorizing..." << std :: endl;
            bot.Auth("zql740125", 3466211762_qq);
            break;
        } catch (const std :: exception& ex) {
            std :: cout << "[ERROR] An error occured when authorizing the robot: " << ex.what() << std :: endl;
        }
        MiraiBot :: SleepSeconds(1);
        std :: cout << "[INFO] Re-authorizing..." << std :: endl;
    }
dbxxx-ac commented 3 years ago

我的CMakeList改成了下面这样:

# CMake 版本要求 (最低 3.1)
cmake_minimum_required (VERSION 3.1)
# 项目名称
project(my-qqrobot)
# 设置项目的 C++ 标准
set(CMAKE_CXX_STANDARD 11)

# 不要构建 mirai-cpp 自带的 examples
set(MIRAI_CPP_BUILD_EXAMPLES OFF CACHE BOOL "Build examples" FORCE)
# 添加子模块 mirai-cpp
add_subdirectory(mirai-cpp)

# 源码以 UTF-8 编码保存,使用 MSVC 编译器时需要加编译参数提供支持
if(MSVC)
    add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
    add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
    message(STATUS "optional: /UTF-8")   
endif(MSVC)

add_executable(${PROJECT_NAME} src/main.cpp)
# 设置头文件目录
include_directories(include)
# 链接 mirai-cpp
target_link_libraries(${PROJECT_NAME} PRIVATE mirai-cpp)
# 使用 mirai-cpp 静态库
target_compile_definitions(${PROJECT_NAME} PRIVATE MIRAICPP_STATICLIB)
# gcc 要连接 pthread
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_link_libraries(${PROJECT_NAME} PRIVATE pthread)
target_link_libraries(${PROJECT_NAME} PRIVATE ssl)
target_link_libraries(${PROJECT_NAME} PRIVATE crypto)
# 上边这两行是我后加的
endif()
dbxxx-ac commented 3 years ago

不一定是bug,也有可能是我哪里搞错了。

dbxxx-ac commented 3 years ago

我还把httplib.h更新成最新版本了……

dbxxx-ac commented 3 years ago

因为旧版本(也就是mirai-cpp内置的httplib.h版本)的httplib.h好像有bug

cyanray commented 3 years ago

我没尝试过这个http库的全部功能,所以也不清楚错误在哪里。 定位错误需要你提供崩溃时的调用堆栈。

定义这个宏的话,用下面的方式也许会比较好(否则你要确保这个宏的定义在#include<mirai.h>之上)

# 加入这一行
target_compile_definitions(${PROJECT_NAME} PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
target_link_libraries(${PROJECT_NAME} PRIVATE ssl)
target_link_libraries(${PROJECT_NAME} PRIVATE crypto)

如果你需要发起http请求,其实我更推荐你使用curl而不是使用mirai-cpp内置的http库。(虽然引入两个http库蛮蠢的,但是没办法,这是cpp)

dbxxx-ac commented 3 years ago

我没尝试过这个http库的全部功能,所以也不清楚错误在哪里。 定位错误需要你提供崩溃时的调用堆栈。

定义这个宏的话,用下面的方式也许会比较好(否则你要确保这个宏的定义在#include<mirai.h>之上)

# 加入这一行
target_compile_definitions(${PROJECT_NAME} PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
target_link_libraries(${PROJECT_NAME} PRIVATE ssl)
target_link_libraries(${PROJECT_NAME} PRIVATE crypto)

如果你需要发起http请求,其实我更推荐你使用curl而不是使用mirai-cpp内置的http库。(虽然引入两个http库蛮蠢的,但是没办法,这是cpp)

感谢您的回复!

感谢您的建议,我换用curl试下。