如何编译生成包含全部API函数的mosquitto.lib库
问题成因
该问题是Mosquitto旧版本(1.6.x及更早分支)Windows Visual Studio工程的默认配置缺陷导致:
- 官方源码的VS解决方案中拆分了两个独立的静态库项目,两个项目的输出文件名被配置为相同的
mosquitto.lib,但二者存放的源码、实现的API完全不重叠:- 位于
lib/目录下的库项目,实现了mosquitto_client_id、mosquitto_connect这类客户端基础操作接口,输出路径默认在lib/Release(或对应Debug目录)下 - 位于
src/目录下的库项目,本来是为broker服务的内部静态依赖,但包含了mosquitto_loop_forever、mosquitto_loop_start等客户端事件循环相关的源码,输出路径默认在src/Release(或对应Debug目录)下
- 位于
- 两个项目输出目录不同、文件名完全一致,编译后如果只靠文件名搜索拷贝lib,很容易只拿到其中一个,就会出现部分API找不到的链接错误。
完整静态库编译配置方法
有两种可行方案,按需选择即可:
方案一:修改单项目配置(操作最简单)
- 打开VS解决方案,找到
lib/目录下的mosquitto库项目(即实现mosquitto_client_id的项目),右键打开属性页。 - 在「C/C++ - 常规 - 附加包含目录」中,添加源码根目录的
src文件夹路径。 - 在项目的源文件筛选器上右键,选择「添加 - 现有项」,把
src目录下所有mosquitto_*.c开头的客户端相关源文件(比如mosquitto_loop.c、mosquitto_loop_forever.c)添加到当前项目中,注意不要添加broker相关的mosquitto.c(主程序入口)、persist*.c、conf*.c这类服务端专属文件。 - 右键解决方案,选择「项目依赖」,取消
src目录下重名mosquitto项目的生成关联,避免后续编译覆盖当前项目的输出。 - 选择目标平台(x86/x64)和编译配置(Release/Debug),直接编译
lib/目录下的项目,输出的mosquitto.lib就包含所有客户端API。
方案二:合并两个静态库(不用修改源码引用)
- 先分别编译两个重名的mosquitto项目,拿到两份各自生成的
mosquitto.lib,将两个lib存到不同文件夹,避免互相覆盖。 - 打开VS自带的开发人员命令提示符,切换到库存放的目录,执行以下命令合并两个静态库:
lib /OUT:mosquitto_full.lib [lib目录下的mosquitto.lib路径] [src目录下的mosquitto.lib路径]
- 生成的
mosquitto_full.lib就是包含全量API的完整库,直接将文件名改成mosquitto.lib即可使用。
注意:不管用哪种方案,编译时选择的运行时库选项(/MT、/MD、/MTd、/MDd)必须和自身业务项目配置完全一致,否则会出现链接符号不匹配的错误。
内容的提问来源于stack exchange,提问作者rahul
相关产品推荐
相关产品推荐

