模块划分

合理编写模块的 demo.h、demo.cc

下例为C++为后端服务编写的探活检测服务

  • health_server.h
  1. #ifndef HEALTH_SERVER_H
  2. #define HEALTH_SERVER_H
  3. #include <iostream>
  4. //#include "utils/flags.h"
  5. void health_server( const std::string &health_host , const std::string &health_port );
  6. #endif
  1. 必加#ifndef: 预处理功能(宏定义,文件包含和条件编译)中的条件编译,主要用来防止重复编译,“multiple define”错误
  2. .h中的其它预处理功能include***,遵循最小使用原则,如上例 仅使用std::string,则对应 仅加入#include<iostream>
  3. .cc文件也需要添加 对应#include "health_server.h" 文件

    health_server.cc
  1. #include <dirent.h>
  2. #include <fstream>
  3. #include <sys/stat.h>
  4. #include <sys/types.h>
  5. #include <unistd.h>
  6. #include <atomic>
  7. #include <memory>
  8. #include <thread>
  9. #include <iostream>
  10. #include "health_server.h"
  11. #include "./http_server.h"
  12. mg_serve_http_opts oppo::HttpServer::s_server_option;
  13. std::atomic<bool> server_stop(true);
  14. std::unordered_map<std::string, oppo::ReqHandler> oppo::HttpServer::s_handler_map;
  15. std::unordered_set<mg_connection *> oppo::HttpServer::s_websocket_session_set;
  16. static bool HandleHealth(std::string url, std::string body,
  17. mg_connection *c, oppo::OnRspCallback rsp_callback)
  18. {
  19. if (!server_stop)
  20. rsp_callback(c, "OK");
  21. else
  22. rsp_callback(c, "STOP");
  23. return true;
  24. }
  25. static bool HandleStop(std::string url, std::string body,
  26. mg_connection *c, oppo::OnRspCallback rsp_callback)
  27. {
  28. if (!server_stop) {
  29. server_stop = true;
  30. rsp_callback(c, "STOP OK");
  31. }
  32. else {
  33. rsp_callback(c, "IS STOP");
  34. }
  35. return true;
  36. }
  37. static bool HandleStart(std::string url, std::string body,
  38. mg_connection *c, oppo::OnRspCallback rsp_callback)
  39. {
  40. if (server_stop) {
  41. server_stop = false;
  42. rsp_callback(c, "START OK");
  43. }
  44. else {
  45. rsp_callback(c, "IS START");
  46. }
  47. return true;
  48. }
  49. void health_server( const std::string &health_host , const std::string &health_port ){
  50. std::string health_address(health_host + ":" + health_port);
  51. auto health_server = std::unique_ptr<oppo::HttpServer>(new oppo::HttpServer);
  52. std::thread http_thread([&health_server, health_address]() {
  53. health_server->Init(health_address);
  54. health_server->AddHandler("/asr/health", HandleHealth);
  55. health_server->AddHandler("/asr/stop", HandleStop);
  56. health_server->AddHandler("/asr/start", HandleStart);
  57. health_server->Start();
  58. });
  59. http_thread.join();
  60. }

依赖库部分:

  • gflags使用DEFINE_int32(port, 10086, "grpc listening port")
  1. #include <memory>
  2. #include <gflags/gflags.h>
  3. DEFINE_int32(port, 10086, "grpc listening port");
  • atomic:原子变量,一般在多线程作为锁使用 依赖:#include <atomic>

ERROR

  • 未定义的引用
  • 命令行编写:g++ speech-service-main.cc http_server.cc mongoose.cc -lpthread,严格按照依赖顺序写,-l链接动态库
  • CMakeList.txt:
  1. add_library(health_server STATIC
  2. http/health_server.cc
  3. http/http_server.cc
  4. http/mongoose.cc
  5. )
  6. target_link_libraries(health_server PUBLIC pthread)
  7. add_executable(grpc_server_main bin/grpc_server_main.cc)
  8. target_link_libraries(grpc_server_main PUBLIC health_server)

合理编写C++模块(.h、.cc)的更多相关文章

  1. [转]使用 C 编写 Lua 模块

    Lua 作为一种小巧的语言,一般都是嵌入到 C/C++ 中作为扩展语言,但是也可以作为独立的脚本语言使用,并且可以使用 C/C++ 编写扩展模块.在参考资料 [1] 中有怎样用 C/C++ 编写模块的 ...

  2. 为Lua5.3编写C模块简单示例

    为Lua5.3编写C模块简单示例 一.编译安装Lua5.3 MSVC 命令行安装脚本: @echo off md bin md lib md include cd src cl /c /nologo ...

  3. Saltstack_使用指南09_远程执行-编写执行模块

    1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...

  4. 【转】PowerShell入门(十一):编写脚本模块

    转至:http://www.cnblogs.com/ceachy/archive/2013/03/08/PowerShell_Script_Module.html 现在通过编写模块就可以在PowerS ...

  5. 用Perl编写Apache模块续二 - SVN动态鉴权实现SVNAuth 禅道版

    代码地址:https://code.csdn.net/x3dcn/svnauth 以禅道项目管理系统的数据库结构为标准,实现了可用的svn authz验证功能. 以用户名.密码.项目的acl开发程度o ...

  6. 用Perl编写Apache模块

    前言 Apache被许多大流量网站所嫌弃,但很多企业级的场景则更为适用. Apache httpd 从 2.0 之后,已经不仅仅局限于一个 http 的服务器,更是一个完善而强大.灵活而健壮且容易扩展 ...

  7. 使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。

    在新的版本下,使用AndroidStudio编写APICloud模块,已经非常简单了,解决模块未定义,最重要的就是要先看官方的视频! 注意在模块的module.json中name很重要,建议做到三统一 ...

  8. 使用F#编写PowerShell模块

    ▲F#和PowerShell模块 作为可能是人类世界最强大的Shell,PowerShell最大的特点是能够直接在命令间传递.NET对象,而支持这种能力的命令被称作cmdlet.自己编写PowerSh ...

  9. 26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网

    https://www.cnblogs.com/yangfengwu/p/11427504.html SmartConfig/Airkiss 配网需要APP/微信公众号,这节大家先使用我做好的APP/ ...

随机推荐

  1. CSS基本知识点——带你走进CSS的新世界

    CSS基本知识点 我们在学习HTML之后,前端三件套第二件便是CSS,但CSS内容较多,我们分几部分讲解: (如果没有学习HTML,请参考之前文章:HTML知识点概括--一篇文章带你完全掌握HTML& ...

  2. File类获取功能的方法和File类判断功能的方法

    File类获取功能的方法-public String getAbsolutePath() :返回此file的绝对路径名字符串 -public String getPath() :将此File转换为路径 ...

  3. js基础学习-数组

    let arr1 = [ {name: 1} ] let arr2 = [ {age: 23} ] let ages = [11, 22, 23] let newArr = arr1.concat(a ...

  4. gdb调试器在windows下的相关内容

    1.gdb调试器在visual studio或dev c++中也有类似的调试图形化可视界面,但是gdb不同的是它是由命令行组成,他的界面对于习惯图形化可视界面的用户来说一时间会不知所措 2.通过gcc ...

  5. grafana监控配置

    一.配置开启smtp服务 1.编辑grafana配置文件grafana.ini [smtp] enabled = true host = smtp.163.com:25 user = 157xxxx3 ...

  6. 在 macOS 上搭建 Flutter 开发环境

    下载 Flutter SDK flutter官网下载:https://flutter.io/sdk-archive/#macos 若上述链接无法访问,可通过GitHub下载 https://githu ...

  7. 虚言妙诀终虚见,面试躬行是致知,Python技术面试策略与技巧实战记录

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_183 2021年,对于正在找工作的朋友来说,笼罩在新冠肺炎疫情之下,今年的就业季显得更加具有挑战性,更有意思的是,每当这个时候,各 ...

  8. Vue3 生命周期 && Hooks封装 && toRef

    1 # 一.Vue3.0与Vue2.0生命周期改动 2 beforDestroy改名为beforeUnmount 3 destroyed改名为unmounted 4 # Vue3.0页提供了Compo ...

  9. 让 DolphinScheduler 1.3.4 开启 Netty 日志打印,解决流程实例一直在运行中的问题

    关于新一代大数据任务调度 - Apache DolphinScheduler   Apache DolphinScheduler(incubator) 于 17 年在易观数科立项, 19 年 8 月进 ...

  10. Git 10 IDEA撤销推送

    参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 如果推送了多 ...