本文用的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,静态编译就必须跟上了呢?