项目中想要使用某个开源库,需要先自行将其从源码编译出来。
以 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 放进去。