Web Servers and APIs using C++
视频链接:https://www.linkedin.com/learning/web-servers-and-apis-using-c-plus-plus/building-crow?autoplay=true
零. 介绍
1. 目标:
如何使用MongoDB作为数据库在C++中构建网站,??Render / railway作为云服务器部署到Internet。
2. 所需技能
- c++中级知识
- 熟悉使用Docker
- 熟悉使用命令行bash
一. 安装工具
1. 安装Docker
使用C++难点之一是习惯其构建链的复杂性,程序具有单独的生成和连接步骤,必须在dev、build和production machines中安装库,如果任何部分不同步,都会显示不知名错误消息。Docker可以解决这一问题,它可以创建一个image,其中包含需要正确安装的所有工具,并将该image用于dev和prod。
安装Docker Desktop: Docker官网
安装后遇到问题:需更新WSL。按提示安装最新版本运行即可。
安装完成后,可以在桌面使用Docker Desktop,在终端使用Docker CLI。
为了让git bash有多个Tab窗口,安装Hyper(详见专栏安装工具下的博文),在Hyper里使用命令docker version
,显示docker的版本号,显示docker安装成功。
2. 安装c++编辑器
视频中用Atom,我用Vscode。
3. 创建Dockerfile
在bash,切换到桌面(Desktop),使用以下命令创建Dockerfile:
mkdir cppweb
cd cppweb
mkdir cppbox
cd cppbox
code .
在cppbox目录下新建Dockerfile
,编辑,保存。详见cppweb\cppbox\Dockerfile
。
Dockerfile 是创建docker image的blueprint。
Dockerfile里面的每行命令都是:大写开头+
+执行命令;如果一行命令太长,可以用\
结尾,下一行接着写。
Dockerfile中用 #
注释,
其中出现错误:
只能注释一整行,eg:# 更新软件列表
;
如果在命令行后加#
,注释不起作用,eg: RUN apt-get -qq update # 更新软件列表
。
gcc
是C++编译器和一一系列工具;别用最新版的gcc,它可能和代码不兼容。
RUN apt-get -qq update
: 更新可用安装包的列表,并不安装它们。
RUN apt-get -qq upgrade
: 更新可更新的安装包
-qq
:安静执行命令,对任何安装提示都回答"yes",不会打印任何东西;若需详细输出,可用"y"代替"qq"。
RUN apt-get -qq install cmake
: cmake是一个开源跨平台build工具,可用来创建make文件,make文件用来编译和链接代码。
RUN apt-get -qq install libboost-all-dev
:安装boost库,crow微框架依赖boost。
RUN apt-get -qq install build-essential libtcmalloc-minimal4 && \
ln -s /usr/lib/libtcmalloc-minimal.so4 /usr/lib/libtcmalloc-minimal.so`
: 安装build-essential kit和TCMalloc minimal库,前者给image添加重要的dev工具,后者用来分配和释放内存。
第1个Dockerfile创建完成。
4. 运行Dockerfile
(1) 运行命令
在bash,使用命令cd cppbox
切换到cppbox目录下,里面有1个Dockerfile,运行以下命令,它将从Dockerfile中创建一个image:
docker build -t cppbox .
-t
: 标记选项,image标记为cppbox。
(2) 调试过程
error1: apt-get -qq update
仓库没有release文件
* error:
ERROR [2/6] RUN apt-get -qq update
#0 7.914 W: The repository 'http://security.debian.org/debian-security stretch/updates Release' does not have a Release file.
#0 7.914 W: The repository 'http://deb.debian.org/debian stretch Release' does not have a Release file.
#0 7.914 W: The repository 'http://deb.debian.org/debian stretch-updates Release' does not have a Release file.
#0 7.914 E: Failed to fetch http://security.debian.org/debian-security/dists/stretch/updates/main/binary-amd64/Packages 404 Not Found
#0 7.914 E: Failed to fetch http://deb.debian.org/debian/dists/stretch/main/binary-amd64/Packages 404 Not Found
#0 7.914 E: Failed to fetch http://deb.debian.org/debian/dists/stretch-updates/main/binary-amd64/Packages 404 Not Found
#0 7.914 E: Some index files failed to download. They have been ignored, or old ones used instead.
* 解决办法:
把gcc版本从7.3.0
改新一点:12.3
error2:安装libboost-all-dev
* error:
[5/6] RUN apt-get -qq install libboost-all-dev=1.62.0.1:
#0 1.455 E: Version '1.62.0.1' for 'libboost-all-dev' was not found
* 解决办法:
删除版本号,即RUN apt-get -qq install libboost-all-dev
- 新的错误
* error:
Errors were encountered while processing:
#0 193.9 gfortran
#0 193.9 libcoarrays-dev:amd64
#0 193.9 libcoarrays-openmpi-dev:amd64
#0 193.9 E: Sub-process /usr/bin/dpkg returned an error code (1)
* 解决办法
使用--no-install-recommends
,即RUN apt-get install -y libboost-all-dev --no-install-recommends
error3: Unable to locate package xxx
* error:
#0 1.145 E: Unable to locate package built-essential
* 解决办法:
built拼错,改正,RUN apt-get -qq install build-essential
。
如果还是出错,断开VPN连接。
build image成功,最后四行显示:
exporting to image 3.9s
=> => exporting layers 3.9s
=> => writing image sha256:39d17a8f00093163866c75d7ea7d17bda4051819126934092198ca12a220d909 0.0s
=> => naming to docker.io/library/cppbox
(3) 查看libboost库是否安装成功
为了确保image正确build,查看它是否包含boost库。用以下命令将在容器上使用bash:
docker run -ti cppbox:latest bash
在容器中,查看所有libboost库:
find /usr -name libboost*.*
若显示几十个boost库,则安装成功。
退出容器用exit
命令。至此,image被build,且工作正常。