目录设计 #
采用比较通用的现代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的基础编写 #
- 根目录下的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
)
|
- 子目录下的CMakeLists.txt文件
所有的子目录下的CMakeLists.txt文件都是一样的,只需要修改一下库的名称就好了
1
2
| file(GLOB SRC_LIST "*.cc")
add_library(hydra_子目录名 STATIC ${SRC_LIST})
|
这是我大概整体的项目目录规划,后续可能还会更改,在第一次写代码的时候不会直接建立这么多的目录,而是根据需要慢慢的建立,一步一步的进行测试