Skip to main content

1. Hydra基础骨架设计

目录设计 #

采用比较通用的现代C++项目目录结构设计,核心理念就是将关注点进行分离

  • src/: 将所有的.cc源文件放到此目录下
  • include/: 将所有的.hpp头文件放到此目录下
  • conf/: 放配置文件
  • build/: 放一些编译过程中产生的中间文件(CMake)

当然不会将所有的文件都放入到特定的一个目录下,那样的话在一个目录下看着也是非常混乱的,可以在一个目录下针对不同的功能模块在进行划分。

根据每个源文件实现的功能不同,将其划分为4个部分,分别是

  • base:内存、配置、日志、线程池等
  • net:网络核心
  • proc:进程与信号相关
  • logic:业务逻辑

根据以上不同的部分,在include中新建一个hydra目录,在此目录下分别放置base、net、proc、logic目录,这是因为可以将hydra目录当成一个命名空间目录,目的是为了防止与其他库或系统库发生冲突。src目录则直接放置这4个目录即可。

那么整个项目的目录树结构就是

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Hydra/
├── CMakeLists.txt          
├── conf/
│   └── hydra.conf          
├── include/                
│   └── hydra/              
│       ├── base            
│       ├── net/        
│       ├── proc/       
│       └── logic/          
└── src/                
    ├── main.cc
    ├── base/           
    ├── net/                
    ├── proc/               
    └── logic/

测试模块放到后面再去处理吧,先使用main.cc做主要测试。

Cmake的基础编写 #

  1. 根目录下的CMakeLists.txt 分模块编写cmake基础文件,在项目主目录创建一个CMakeLists.txt文件,添加以下内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# cmake的版本至少是3.10
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(Hydra)

# 规定使用C++17标准
set(CMAKE_CXX_STANDARD 17)
# 编译链接好的hydra会直接生成在项目根目录下(${CMAKE_SOURCE_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})

# 如果找不到某个头文件就去项目的include/去寻找
include_directories(${CMAKE_SOURCE_DIR}/include)

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
# cmake的find_package会自动侦测当前系统的线程库叫什么
find_package(Threads REQUIRED)

# 添加子模块: 告诉cmake去src/base等目录下找那个文件里的CMakeLists.txt去执行它,子目录执行完之后,生成的库待根目录使用
add_subdirectory(src/base)
add_subdirectory(src/proc)
add_subdirectory(src/net)
add_subdirectory(src/logic)

# 定义主程序和程序的代码入口文件
add_executable(Hydra src/main.cc)

# 将子目录下生成的库链接起来
target_link_libraries(Hydra
    hydra_proc
    hydra_net
    hydra_logic
    hydra_base
    Threads::Threads
)
  1. 子目录下的CMakeLists.txt文件 所有的子目录下的CMakeLists.txt文件都是一样的,只需要修改一下库的名称就好了
1
2
file(GLOB SRC_LIST "*.cc")
add_library(hydra_子目录名 STATIC ${SRC_LIST})

这是我大概整体的项目目录规划,后续可能还会更改,在第一次写代码的时候不会直接建立这么多的目录,而是根据需要慢慢的建立,一步一步的进行测试