使用cmake构建C++ workflow上手项目(支持Windows,Linux)

2023-05-16

开源的C++后端开发框架workflow(https://github.com/sogou/workflow)已经在成熟的互联网公司得到非常稳定广泛的应用,它结合了网络、异步、计算多个后端常用场景,设计出了非常优秀的任务流理念用来统一调度各项服务资源。
新手在使用这个开发框架构建程序时候,可能会面临安装依赖库或者搭建自己的项目工程的问题,由于官方源码仓库一直没有提供基于cmake构建和创建新项目的工具,这里提供一个基于cmake构建基于imgui新项目的模板源码,所有的三方依赖库全部都含在源码中,不需要额外在系统内部再单独安装依赖,直接拉下源码编译就可以直接运行,支持跨平台,方便搭建工程。

项目结构

workflow_starter
	- snappy
	- openssl
	- lz4
	- zstd
	- workflow
	- src
		| - message.h
		| - message.cc
		| - client.c
		| - main.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.6)

project(workflow_starter)

# --- compile workflow --- #
# macro definition
if (WIN32)
	set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   /MP /wd4200")
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /wd4200 /Zc:__cplusplus /std:c++14")
else ()
	set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   -Wall -fPIC -pipe -std=gnu90")
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC -pipe -std=c++11 -fno-exceptions")
endif ()

# add header path
if (WIN32)
    include_directories(
    	${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src/algorithm
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src/client
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src/factory
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src/kernel_win
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src/manager
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src/nameservice
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src/protocol
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src/server
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src/util
    )
elseif (UNIX)
    include_directories(
 ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-windows/src
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-linux/src/algorithm
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-linux/src/client
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-linux/src/factory
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-linux/src/kernel
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-linux/src/manager
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-linux/src/nameservice
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-linux/src/protocol
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-linux/src/server
        ${CMAKE_CURRENT_SOURCE_DIR}/workflow-0.9.6/workflow-linux/src/util
    )
endif()

# add dependency
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/openssl-1.1.1g/include
)

if (UNIX)
    # for linux kafka support
    include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/snappy-1.1.9
        ${CMAKE_CURRENT_SOURCE_DIR}/snappy-1.1.9/prebuild/linux
        ${CMAKE_CURRENT_SOURCE_DIR}/lz4-1.9.3/lib
        ${CMAKE_CURRENT_SOURCE_DIR}/zstd-1.5.0/lib
    )
endif()

if (WIN32)
    # windows use self build lib
    link_directories(
        openssl-1.1.1g/prebuild/win
    )
else()
    # linux use self build lib
    link_directories(
        openssl-1.1.1g/prebuild/linux
        snappy-1.1.9/prebuild/linux
        lz4-1.9.3/prebuild/linux
        zstd-1.5.0/prebuild/linux
    )
endif()

# specify workflow necessary source to compile lib
if (WIN32)
    file(GLOB WORKFLOW_SRC
        workflow-0.9.6/workflow-windows/src/algorithm/*.h
        workflow-0.9.6/workflow-windows/src/algorithm/*.cc
        workflow-0.9.6/workflow-windows/src/algorithm/*.inl
        workflow-0.9.6/workflow-windows/src/client/*.h
        workflow-0.9.6/workflow-windows/src/client/*.cc
        workflow-0.9.6/workflow-windows/src/factory/*.h
        workflow-0.9.6/workflow-windows/src/factory/*.cc
        workflow-0.9.6/workflow-windows/src/factory/*.inl
        workflow-0.9.6/workflow-windows/src/kernel_win/*.h
        workflow-0.9.6/workflow-windows/src/kernel_win/*.c
        workflow-0.9.6/workflow-windows/src/kernel_win/*.cc
        workflow-0.9.6/workflow-windows/src/manager/*.h
        workflow-0.9.6/workflow-windows/src/manager/*.cc
        workflow-0.9.6/workflow-windows/src/manager/*.inl
        workflow-0.9.6/workflow-windows/src/nameservice/*.h
        workflow-0.9.6/workflow-windows/src/nameservice/*.cc
        workflow-0.9.6/workflow-windows/src/protocol/*.h
        workflow-0.9.6/workflow-windows/src/protocol/*.c
        workflow-0.9.6/workflow-windows/src/protocol/*.cc
        workflow-0.9.6/workflow-windows/src/protocol/*.inl
        workflow-0.9.6/workflow-windows/src/server/*.h
        workflow-0.9.6/workflow-windows/src/server/*.cc
        workflow-0.9.6/workflow-windows/src/util/*.h
        workflow-0.9.6/workflow-windows/src/util/*.cc
        workflow-0.9.6/workflow-windows/src/*.h
    )
elseif (UNIX)
    file(GLOB WORKFLOW_SRC
        workflow-0.9.6/workflow-linux/src/algorithm/*.h
        workflow-0.9.6/workflow-linux/src/algorithm/*.cc
        workflow-0.9.6/workflow-linux/src/algorithm/*.inl
        workflow-0.9.6/workflow-linux/src/client/*.h
        workflow-0.9.6/workflow-linux/src/client/*.cc
        workflow-0.9.6/workflow-linux/src/factory/*.h
        workflow-0.9.6/workflow-linux/src/factory/*.cc
        workflow-0.9.6/workflow-linux/src/factory/*.inl
        workflow-0.9.6/workflow-linux/src/kernel/*.h
        workflow-0.9.6/workflow-linux/src/kernel/*.c
        workflow-0.9.6/workflow-linux/src/kernel/*.cc
        workflow-0.9.6/workflow-linux/src/manager/*.h
        workflow-0.9.6/workflow-linux/src/manager/*.cc
        workflow-0.9.6/workflow-linux/src/manager/*.inl
        workflow-0.9.6/workflow-linux/src/nameservice/*.h
        workflow-0.9.6/workflow-linux/src/nameservice/*.cc
        workflow-0.9.6/workflow-linux/src/protocol/*.h
        workflow-0.9.6/workflow-linux/src/protocol/*.c
        workflow-0.9.6/workflow-linux/src/protocol/*.cc
        workflow-0.9.6/workflow-linux/src/protocol/*.inl
        workflow-0.9.6/workflow-linux/src/server/*.h
        workflow-0.9.6/workflow-linux/src/server/*.cc
        workflow-0.9.6/workflow-linux/src/util/*.h
        workflow-0.9.6/workflow-linux/src/util/*.cc
        workflow-0.9.6/workflow-linux/src/*.h
    )
endif()

if (WIN32)
    add_library(workflow 
        ${WORKFLOW_SRC}
        )

    # must specify the macro in windows
    target_compile_definitions(
		workflow PRIVATE
		strdup=_strdup
		strcasecmp=_stricmp
		strncasecmp=_strnicmp
	)

    target_link_libraries(workflow 
        # link to prebuild lib, remember to copy dll to bin dir
        libssl.lib 
        libcrypto.lib

        # link behind
        ws2_32 
        wsock32 
    )

elseif (UNIX)
    add_library(workflow 
        ${WORKFLOW_SRC}
        )

    target_link_libraries(workflow 
        # link to prebuild lib
        libssl.a
        libcrypto.a
        libsnappy.a
        liblz4.so
        libzstd.a

        # link behind
        pthread 
        dl
    )
endif ()

# --- build self demo --- #
# -- main
# add source code
set(SRC 
    src/message.h
    src/message.cc
    src/main.cpp
)

# generate binary
add_executable(main ${SRC})

# link the whole workflow lib
target_link_libraries(main workflow)

# -- client
set(CLIENT_SRC
    src/message.h
    src/message.cc
    src/client.cc
)

add_executable(client ${CLIENT_SRC})

target_link_libraries(client workflow)


说明

  • 所有依赖库都预编译好含在工程里,主项目编译时候自动链接到内嵌的依赖库,不需要再系统内部安装第三方依赖库
  • 支持windows和linux
  • 示例代码里包含了经常使用的网络通信和计算任务
  • workflow框架目前暂不支持基于tcp协议的订阅发布长连接主动推送机制,如果需要则自行开发和集成

源码

https://github.com/tashaxing/workflow_starter

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用cmake构建C++ workflow上手项目(支持Windows,Linux) 的相关文章

随机推荐

  • C++理论复习之运算符重载

    C 43 43 运算符重载 重载操作符的一般格式 xff1a Type operator 43 Type A Type B 可重载与不可重载的操作符列表 操作符重载的注意事项 重载操作符必须有一个类类型的操作数 xff0c 不能重载内置类型
  • 计算机网络概述

    OSI参考模型 国际标准化组织 I S O 开发了开放式系统互联 O S I 参考模型 xff0c 以促进计算机系统的开放互联 开放式互联就是可在多个厂家的环境中支持互联 很少有产品是完全的O S I 模式 xff1b 相反 xff0c 其
  • PCL:如何自定义一个点云PointT类型

    1 xff0c 使用基础点云类型 include 34 pcl point types h 34 include 34 pcl impl instantiate hpp 34 include 34 foo h 34 include 34 i
  • IP地址

    ip地址的分类 A类地址 设计IPv4 A类地址的目的是支持巨型网络 xff0c 因为对规模巨大网络的需求很小 xff0c 因此开发了这种结构使主机地址数很大 xff0c 而严格限制可被定义为A类网络的数量 一个A类I P地址仅使用第一个8
  • 数据存储大端小端模式的理解

    Big Endian和Little Endian的定义如下 xff1a 1 Little Endian就是低位字节排放在内存的低地址端 xff0c 高位字节排放在内存的高地址端 2 Big Endian 就是高位字节排放在内存的低地址端 x
  • cocos2dx实例开发之经典坦克

    小时候红白机上玩的的经典90坦克 xff0c 看起来简单 xff0c 做起来其实有点复杂 xff0c 这里用原版素材还原了一个简版 预览 工程结构 游戏架构 包括场景 xff1a 欢迎界面 xff0c 主菜单游戏场景 步骤 菜单场景 对于图
  • 数值分析C++:统计(均值/方差/偏度/峰度),积分,微分,蒙特卡罗

    用C 43 43 实现几个简单的数值分析计算 xff0c 以便深入理解计算机在求解代数问题的过程 原理 以下主要针对普通实数 xff0c 以及一元代数 统计 算数平均值 几何平均值 方差 偏度 峰度 积分 求解定积分的一般数学描述式 但是由
  • python脚本编程:监控指定进程的cpu和内存使用率

    为了测试某个服务的稳定性 xff0c 通常需要在服务长时间运行的情况下 xff0c 监控其资源消耗情况 xff0c 比如cpu和内存使用 这里借助python的psutil这个包可以很方便的监控指定进程号 xff08 PID xff09 的
  • python脚本编程:实时监控日志文件

    用python可以很小巧轻便的实时监控日志文件增量刷新 xff0c 根据某些关键字进行匹配 xff0c 方便做运维异常告警 代码 span class token keyword import span time span class to
  • C++获取机器启动至今的时长和机器启动的时间戳

    根据当前时间戳与机器启动至今的时间长度相减 xff0c 可以精确计算出机器启动时刻的时间戳epochtime 代码 span class token macro property span class token directive key
  • pytorch基于RNN实现文本情感分析并用C++加载模型预测

    文本情感分析是机器学习自然语言处理NLP中常见的应用场景 xff0c 给定一段文本 xff0c 识别其中的情绪或态度 xff0c 对其进行分类并标签化 这个手段可以应用于书籍电影评价 用户对产品满意度调查 人机对话感情色彩提取和金融研报分析
  • pytorch使用matplotlib和tensorboard实现模型和训练的可视化

    pytorch构建和训练深度学习模型的过程中 xff0c 往往需要能够直观的观测到可视化的过程 xff0c 比如画出训练曲线等 对于简单的曲线绘制可以使用matplotlib库做出基本的图 xff0c 如果需要更加高级的可视化过程 xff0
  • Eigen库:常见错误(最坑的库,没有之一)

    1 3rdparty eigen eigen3 eigen src core assignevaluator h 833 error C2338 YOU MIXED MATRICES OF DIFFERENT SIZES Eigen Mat
  • win10 资源管理器打开FTP站点跳到IE

    原文链接 xff1a https zhidao baidu com question 549827901 html 我也遇到一样的问题 xff0c 参考很多网页 xff0c 最好终于解决了 xff0c 我不能保证一定解决你的问题 xff0c
  • C++11写的一个简洁的单例类型模版包装器

    单例是经常用到的设计模式实践 xff0c 对于全局使用的唯一资源事例一般都把类型封装成单例 xff0c 但是有时候觉得对于每个class都要改造一遍单例会觉得比较繁琐 xff0c 尤其是在预先不知道哪些类型会使用为单例的时候 为了应对这种情
  • C++获取对应进程的cpu和内存使用情况(支持linux和windows)

    运维监控程序中经常需要根据一个进程号pid去监控实时的cpu和内存占用 xff0c 以下整理了一个C 43 43 实现的简单例子 xff0c 并封装为方便跨平台调用的函数 代码 span class token macro property
  • 基于C++ spdlog日志库的完善封装

    spdlog是一个C 43 43 编写的极速日志打印库 xff0c 支持异步写日志以及多种模式和格式化选项 以下基于spdlog库封装了一个简单易用的功能类 xff0c 采用的是header only方式 xff0c 便于项目集成 代码 p
  • C++11写的线程安全STL库

    用C 43 43 写的程序 xff0c 如果用到了自带的标准模板库STL xff0c 在多线程访问的时候如果不加锁很容易造成segment fault导致程序崩溃coredump xff0c 也就是说C 43 43 标准的STL不是线程安全
  • 使用cmake构建C++ imgui上手项目(支持Windows,Mac,Linux)

    优秀的即时渲染C 43 43 GUI开发框架imgui xff08 https github com ocornut imgui xff09 在很多场合能发挥非常棒的作用 但是由于官方源码仓库一直没有提供基于cmake构建和创建新项目的工具
  • 使用cmake构建C++ workflow上手项目(支持Windows,Linux)

    开源的C 43 43 后端开发框架workflow xff08 https github com sogou workflow xff09 已经在成熟的互联网公司得到非常稳定广泛的应用 xff0c 它结合了网络 异步 计算多个后端常用场景