创建于 2020-07-31,最终修订于 2020-08-06
在之前的介绍课程(零)中我们说了要用六节课来实现一个HTTP,
今天的任务是 “[易]简单的Cmake的教程,选用一个Socket库并实现一个echo”。
所有的代码都在 https://github.com/dashjay/http_demo/tree/master/1-cmake-socket-echo 中
Let’s do it
0x1 编写一个HelloWorld并尝试使用Cmake编译它
#include<iostream>
int main(){
std::cout << "Hello World!" << '\n';
}
我们本可以使用如下命令进行编译并且运行
g++ -o main main.cpp
./main
Hello World!
但是我们要尝试使用一次Cmake[1]
# 指定cmake的版本,随意了,我们不会用太高级的功能
cmake_minimum_required(VERSION 3.16)
# set可以设定一个变量
set(project_name http_demo)
# 项目名称 ${xxxx} 可以导入之前的变量
project(${project_name})
set(CMAKE_CXX_COMPILER "c++") # 编译器
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_STANDARD 17) # cpp指定标准
# 设定编译的FLAGS
set(CMAKE_CXX_FLAGS -g -W)
string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
message(STATUS "CMAKE_CXX_FLAGS: " "${CMAKE_CXX_FLAGS}")
# 添加一个可执行文件
add_executable(main main.cpp)
通常情况下我们不会再项目目录里执行 cmake .
,这会导致很多混乱的问题,我们通常创建一个build文件夹做这个操作
mkdir build; cd build
cmake .. && make
./main
Hello World!
build目录下会产生很多文件,通常我们不用理会他们,只需要管我们的输出文件即可。
为什么弄这么麻烦的东西
当项目复杂到一定程度时,有大量自动化的操作可以节省我们的时间,例如我们可以针对Hello World输出生成一个测试,每次编写完程序,我们只需要make一下(如果cmake文件没有变化的话),然后运行make test来进行自动化测试(测试样例需要我们自己编写)。当然这个Cmake在本次项目中的作用也不是很能体现出优势,但是笔者认为仍然有必要学习这种自动化工具。
0x2 选用一个cpp的socket库
经过一些挑选,选中了一个叫Sockpp的库。这个库用法很“现代”CPP,十分舒适,有很多上古socket库,用法或者代码比较古老了,我就只推荐这个了。
安装也很简单
git clone https://github.com/fpagliughi/sockpp
cd sockpp; mkdir build; cd build
cmake .. && make && sudo make install
这样,sockpp就安装到你系统中了,确切的说是分别安装了头文件和依赖库到你系统的 include 和 lib 中。
1. 了解sockpp的使用
我们在本节课中暂时只简单的使用 tcp 接收一些数据,因此我们在本节课程里只引入 sockpp 的一个头部