如何在项目中使用开源库——从源码编译出动态库(以mosquitto为例)

项目中想要使用某个开源库,需要先自行将其从源码编译出来。

以 mosquitto 为例,其源码地址:https://github.com/eclipse/mosquitto

如下图所示,下载 zip 格式。

在这里插入图片描述
使用解压命令,将其解压:

unzip mosquitto-master.zip

阅读 README 文档,发现编译步骤如下(本文所用环境为 linux 环境,所以只需要 make)。

在这里插入图片描述

于是:

cd mosquitto-master
make

====================================================================
此时,可能会因为缺少某些东西,导致编译失败,按照提示进行安装即可。

e.g.

fatal error: cjson/cJSON.h: No such file or directory # include <cjson/cJSON.h>

这说明我们缺少 cJson。

可以通过 sudo apt-get 安装,也可以同样使用源码安装。本文使用源码安装。

其源码地址:https://github.com/DaveGamble/cJSON

在其 README 文档中找到安装步骤,如下:

在这里插入图片描述

也就是说:

unzip cJSON-master.zip
cd cJSON-master
mkdir build
cd build
cmake ..
make
make install

====================================================================

mosquitto 编译成功后,可以在 lib 文件夹中发现成功生成了动态库 libmosquitto.so.1

想在自己的项目中使用 mosquitto?

将 mosquitto 的 include 文件夹中的四个文件,以及自己生成的 libmosquitto.so.1 加入自己的项目中。假设最后的项目结构如图所示:

在这里插入图片描述
编写正确的 CMakeLists ,将 mosquitto 的 头文件动态库 加入项目:

project(test)   

INCLUDE_DIRECTORIES(./include)
AUX_SOURCE_DIRECTORY(./src  SRC_LIST)        

# 将 mosquitto 的头文件路径、库文件路径赋给变量
set(MOSQUITTO_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/mosquitto" CACHE PATH "Location of libraries")
set(MOSQUITTO_INCLUDE_DIRS ${MOSQUITTO_ROOT_PATH}/include/)
set(MOSQUITTO_LIB ${MOSQUITTO_ROOT_PATH}/lib/libmosquitto.so.1)

# 添加 mosquitto 头文件
INCLUDE_DIRECTORIES(${MOSQUITTO_INCLUDE_DIRS})   

# 指定运行时,动态库的加载路径 
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) 
SET(CMAKE_INSTALL_RPATH "\${ORIGIN}/lib")        

ADD_EXECUTABLE(test ${SRC_LIST})
target_link_libraries(test ${MOSQUITTO_LIB})     # 链接动态库

tip:

由于使用的是动态库,所以最后运行时仍需外部加载它。本文已在 CMakeLists 中指定了运行时动态库的加载路径 "${ORIGIN}/lib "。

所以,在运行可执行文件前,需要在可执行文件的同级目录下新建 lib 文件夹,将动态库 libmosquitto.so.1 放进去。

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值