当前位置: 首页 > news >正文

Linux编译cpprestsdk库

本文用的Linux系统为Ubuntu22.04,自带GCC11.3.0。


依赖
①编译需要boost库,本文用的库版本为boost-1.82.0.beta1.tar.gz。
②编译需要openssl库,这里使用的版本为openssl-1.1.1s.tar.gz。
③编译需要cmake库,本文使用的是cmake-3.22.1。


编译依赖
①静态编译boost库到用户目录

./bootstrap.sh
./b2 -a  cxxflags='-fPIC -std=c++17' install --prefix=/home/code/cpprestsdk/boostlib link=static threading=multi boost.locale.icu=off

②静态编译openssl库到用户目录

./config --prefix=/home/code/cpprestsdk/openssllib -fPIC no-shared
make && make install

下载cpprtstsdk模块

git clone https://github.com/Microsoft/cpprestsdk
cd cpprestsdk
git submodule update --init

下载完成后需要修改一下CMakeLists.txt

cd Release
vi CMakeLists.txt

将以下三行

set(WERROR ON CACHE BOOL "Treat Warnings as Errors.")
set(CPPREST_EXCLUDE_WEBSOCKETS OFF CACHE BOOL "Exclude websockets functionality.")
set(CPPREST_EXCLUDE_COMPRESSION OFF CACHE BOOL "Exclude compression functionality.")

改成

set(WERROR OFF CACHE BOOL "Treat Warnings as Errors.")
set(CPPREST_EXCLUDE_WEBSOCKETS ON CACHE BOOL "Exclude websockets functionality.")
set(CPPREST_EXCLUDE_COMPRESSION ON CACHE BOOL "Exclude compression functionality.")

注意,这里第一行是将警告视为错误关闭,避免编译报错,后两行是去掉zlib依赖,如果系统上有zlib或者单独编译了zlib库,这两行可以不修改。

动态编译cpprestsdk模块

mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DOPENSSL_ROOT_DIR=/home/code/cpprestsdk/openssllib -DOPENSSL_INCLUDE_DIR=/home/code/cpprestsdk/openssllib/include -DBoost_LIBRARIES=/home/code/cpprestsdk/boostlib/lib -DBoost_INCLUDE_DIR=/home/code/cpprestsdk/boostlib/include -DCMAKE_INSTALL_PREFIX=/home/code/cpprestsdk/cpprestsdklib
make && make install

注意:如果上一步中没有去掉zlib库依赖,这里cmake命令中需要跟上zlib的信息(我就是因为zlib编译不过才去掉了zlib库依赖)

-DZLIB_INCLUDE_DIR=/home/code/cpprestsdk/zliblib/include -DZLIB_LIBRARY=/home/code/cpprestsdk/zliblib/lib

坐等编译完成(时间有点久,可能是因为是虚拟机的原因)。

测试程序
测试代码可以复制我另一篇博客:C++下最简单的Http服务器,注意把监听地址改成“127.0.0.1:9092”。
这里编译程序命令如下:

# 指定编译器
CC=g++
#指定编译选项
CFLAGS=-Wall -g
Target=res
Src:=$(wildcard ./*.cpp)
Objs:=$(patsubst %.cpp,%.o, $(Src))
#指定头文件位置
INCLUDES = -I/home/code/cpprestsdk/cpprestsdklib/include -I/home/code/cpprestsdk/boostlib/include -I/home/code/cpprestsdk/openssllib/include
#指定库文件
LIBS=-L/home/code/cpprestsdk/cpprestsdklib/lib -lcpprest$(Target):$(Objs)echo $(Objs)@mkdir -p output$(CC) $(Objs) $(LIBS) -o output/$(Target)%.o:%.cpp$(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@clean:rm $(Objs)

因为boost和openssl库都是静态编译的,所以编译命令不需要跟boost和openssl(备注:运行的时候,会提示找不到libcpprest.so.2.10,这里需要临时设置一下环境变量:export LD_LIBRARY_PATH=实际目录)。


静态编译cpprestsdk模块
其实动态和静态编译只需要修改一下CMakeLists.txt文件即可,如下

if(IOS OR ANDROID)set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries")
else()set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries")
endif()

改成

if(IOS OR ANDROID)set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries")
else()set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries")
endif()

这里默认iOS和Android是静态编译,其他都是动态编译,不启用其他平台的动态编译即可。
Makefile文件需要改一下:

# 指定编译器
CC=g++
#指定编译选项
CFLAGS=-Wall -g
Target=res
Src:=$(wildcard ./*.cpp)
Objs:=$(patsubst %.cpp,%.o, $(Src))
#指定头文件位置
INCLUDES = -I/home/code/cpprestsdk/cpprestsdklib/include -I/home/code/cpprestsdk/boostlib/include -I/home/code/cpprestsdk/openssllib/include
#指定库文件
LIBS=-L/home/code/cpprestsdk/cpprestsdklib/lib -lcpprest -L/home/code/cpprestsdk/openssllib/lib -lssl -lcrypto$(Target):$(Objs)echo $(Objs)@mkdir -p output$(CC) $(Objs) $(LIBS) -o output/$(Target)%.o:%.cpp$(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@clean:rm $(Objs)

一个疑问
为什么动态编译的时候,Makefile里面不用跟上openssl,静态编译就必须跟上了呢?

http://www.lryc.cn/news/42729.html

相关文章:

  • 算法的时间复杂度和空间复杂度
  • 基本认识vue3
  • HTTP/HTTPS协议认识
  • 【VScode】远程连接Linux
  • QT/C++调试技巧:内存泄漏检测
  • 【贪心算法】一文让你学会“贪心”(贪心算法详解及经典案例)
  • 【字体图标iconfont】字体图标部署流程+项目源码分析
  • 2023最全的Web自动化测试介绍(建议收藏)
  • jvm_根节点枚举安全点安全区域
  • fabric(token-erc-20链码部署)
  • C语言基础——流程控制语句
  • WinForm | C# 界面弹出消息通知栏 (仿Win10系统通知栏)
  • 刷题之最长公共/上升子序列问题
  • 【数据结构】千字深入浅出讲解栈(附原码 | 超详解)
  • 自动驾驶V2X
  • 零基础自学网络安全/渗透测试有哪些常见误区?
  • ConvMixer:Patches Are All You Need
  • day10—编程题
  • 如何测量锂电池的电量
  • 菜鸟刷题Day6
  • DecimalFormat格式化显示数字
  • cpu中缓存简介
  • 【数据结构】二叉树的遍历以及基本操作
  • 若依框架 --- ruoyi 表格的设置
  • “两会”网络安全相关建议提案回顾
  • 一篇文章带你真正了解接口测试(附视频教程+面试真题)
  • C/C++每日一练(20230325)
  • Linux操作系统ARM指令集与汇编语言程序设计
  • 计网之HTTP协议和Fiddler的使用
  • sql性能优化:MS-SQL(SQL Server)跟踪日志信息结果列字段说明,MSSQL的列字段说明(column)