美文网首页
Ubuntu22.04-drogon-静态编译环境

Ubuntu22.04-drogon-静态编译环境

作者: 国服最坑开发 | 来源:发表于2023-04-05 11:44 被阅读0次
drogon

0x00 前言

觊觎drogon WEB高性能表现已久,虽然开发部分相对简单,但考虑到部署环境均为Linux,且版本情况分布不一,于是就花费两天整理明白了:纯静态编译输出执行文件的流程。
官网:https://github.com/drogonframework/drogon

0x01 虚拟机安装

  • 基础工具安装
sudo apt update
sudo apt install vim net-tools -y
  • 开启远程 ssh
sudo apt install openssh-server
sudo vim /etc/ssh/sshd_config
# 去掉注释:
ListenAddress 0.0.0.0
# 重启服务
sudo service ssh status
sudo service ssh restart
  • 安装编译工具
sudo apt install build-essential libssl-dev libjsoncpp-dev uuid-dev zlib1g-dev libc-ares-dev libhiredis-dev g++-12 cmake git curl
  • 配置gcc/g++
cd /usr/bin/
sudo rm gcc g++
sudo ln -s g++-12 g++
sudo ln -s gcc-12 gcc
# 确认版本
gcc --version
g++ --version

0x02 源码编译 数据库驱动

wget http://archive.ubuntu.com/ubuntu/pool/universe/m/mariadb-connector-c/mariadb-connector-c_3.0.3.orig.tar.gz
tar -zxf mariadb-connector-c_3.0.3.orig.tar.gz
cd mariadb-connector-c-3.0.3-src
# 修复一个小Bug:
vim cmake/ConnectorName.cmake
END() -> ENDIF()

vim CMakeLists.txt
# 在 PROJECT(mariadb-connector-c C) 下添加一行:
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")

mkdir build
cd build
cmake .. -DWITH_SSL=system -DWITH_EXTERNAL_ZLIB=ON -DWITH_STATIC=ON
make -j && sudo make install 

0x03 源码编译 jsoncpp

因为libjsoncpp-dev 安装后, 没有.a 库,需要手动安装

git clone https://github.com/open-source-parsers/jsoncpp
cd jsoncpp/
mkdir build
cd build
cmake ..
make -j && sudo make install

# 作一下链接
sudo ln -s /usr/local/lib/libjsoncpp.a /usr/lib/x86_64-linux-gnu/libjsoncpp.a
# 使用ld验证链接时能找到 
ld -ljsoncpp --verbose | grep libjsoncpp.a

0x04 安装drogon

1.下载源码

git clone https://github.com/drogonframework/drogon
cd drogon
git submodule update --init

1.安装 dg_ctl, 以动态方式安装。

因为脚手架命令工具只在本机执行,所以使用动态编译安装。

mkdir build
cd build
cmake ..
make -j && sudo make install
# 验证
dg_ctl help create

2.编译安装 dragon.a 静态库

  • 修改CMakeLists.txt
    找到 project(drogon) 上下分别添加 一行:
set(CMAKE_CXX_FLAGS "-fcoroutines -std=c++20 -static -static-libgcc -static-libstdc++")
project(drogon) 
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")

执行编译

cd build
# 删除上一次编译的中间文件
rm -rf ./*
cmake .. -DBUILD_EXAMPLES=OFF  -DBUILD_CTL=OFF -DCMAKE_BUILD_TYPE=Release 

cmake 输出如下:

-- The C compiler identification is GNU 12.1.0
-- The CXX compiler identification is GNU 12.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- compiler: GNU
-- Performing Test COMPILER_HAS_HIDDEN_VISIBILITY
-- Performing Test COMPILER_HAS_HIDDEN_VISIBILITY - Success
-- Performing Test COMPILER_HAS_HIDDEN_INLINE_VISIBILITY
-- Performing Test COMPILER_HAS_HIDDEN_INLINE_VISIBILITY - Success
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR - Success
-- Looking for C++ include any
-- Looking for C++ include any - found
-- Looking for C++ include string_view
-- Looking for C++ include string_view - found
-- Looking for C++ include coroutine
-- Looking for C++ include coroutine - found
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.a (found version "3.0.2")
-- Trantor using SSL library: OpenSSL
-- Found c-ares: /usr/include
-- c-ares found!
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
-- Looking for C++ include filesystem
-- Looking for C++ include filesystem - found
-- Performing Test CXX_FILESYSTEM_NO_LINK_NEEDED
-- Performing Test CXX_FILESYSTEM_NO_LINK_NEEDED - Success
-- Found std::filesystem
-- use c++20
-- Found Jsoncpp: /usr/local/include
-- jsoncpp verson:1.9.5
-- yaml-cpp not used
-- Found UUID: /usr/lib/x86_64-linux-gnu/libuuid.a
-- Could NOT find BROTLI (missing: BROTLIDEC_LIBRARY BROTLIENC_LIBRARY BROTLICOMMON_LIBRARY BROTLI_INCLUDE_DIR)
-- Could NOT find PostgreSQL (missing: PostgreSQL_LIBRARY PostgreSQL_INCLUDE_DIR)
-- Could NOT find pg (missing: PG_LIBRARIES PG_INCLUDE_DIRS)
-- MySQL Include dir: /usr/local/include/mariadb
-- MySQL client libraries: /usr/local/lib/mariadb/libmariadbclient.a
-- Ok! We find mariadb!
-- Looking for mysql_optionsv in MySQL_lib
-- Looking for mysql_optionsv in MySQL_lib - not found
-- sqlite3 was not found.
-- Found Hiredis: /usr/lib/x86_64-linux-gnu/libhiredis.a
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.a (found version "1.2.11")
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/g/prj_cpp/drogon/build

执行编译

make -j
sudo make install
编译成功

0x05 创建测试工程

cd $work_path
dg_ctl create project demo
  • 修改main.cc 端口至 8000
  • 修改CMakeListstxt
# 加两行
set(CMAKE_CXX_FLAGS "-fcoroutines -std=c++20 -static -static-libgcc -static-libstdc++")
project(demo CXX)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")

# 注释掉最后一行 测试工程
#add_subdirectory(test)
  • 执行编译
mkdir build
cd build
cmake ..
make -j 

编译完成,有几行warning, 选择无视(静态代码中使用了调用动态库的API)

  • 验证
ldd demo
not a dynamic executable  # 说明这是一个静态编译的执行文件
  • 执行程序
nohup ./demo &
  • 访问接口:
curl localhost:8000
# 返回如下:
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white" text="black">
<center><h1>404 Not Found</h1></center>
<hr><center>drogon/1.8.4</center>
</body>
</html>
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->

说明程序正常运行。

  • 远程测试
    把demo文件复制到另外一台 linux环境,进行上述验证,确保没有问题。

能进行到这里,说明已经可以快乐的玩耍了。

相关文章

网友评论

      本文标题:Ubuntu22.04-drogon-静态编译环境

      本文链接:https://www.haomeiwen.com/subject/qyueddtx.html