在 Linux 上使用 cmake 独立编译 PahoMqttCpp 示例

2023-12-02

My goal

...就是使用示例代码async_subscribe.cpp来自 PahoMqttCpp 项目 (https://github.com/eclipse/paho.mqtt.cpp)作为一个独立的应用程序,然后根据我的需要对其进行修改。

我的方法

预赛

在最新型号的 Raspberry pi 上(uname -a--> 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux)我已按照 PahoMqttCpp README.md 文件中的描述进行操作。我成功编译了C库(v1.2.1),然后成功编译了Cpp部分,最后将两个库安装到/usr/local/lib。在此过程中,没有发生任何错误。

我的项目

然后,作为我自己项目的开始,我复制了async_subscribe.cpp从 PahoMqttCpp 示例到一个空目录并开始构建CMakeLists.txt来编译它。天真地,我从这个版本开始:

cmake_minimum_required(VERSION 3.5)
add_library(PahoMqttC SHARED IMPORTED)
set_target_properties(PahoMqttC PROPERTIES IMPORTED_LOCATION /usr/share/lib/libpaho-mqtt3a.so)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
find_package(PahoMqttCpp REQUIRED)
add_executable(async_subscribe async_subscribe.cpp)
include_directories(${PahoMqttCpp_INCLUDE_DIRS})
target_link_libraries(async_subscribe ${PahoMqttCpp_LIBRARIES})
target_link_libraries(async_subscribe ${PahoMqttC_LIBRARIES})
install(TARGETS async_subscribe RUNTIME DESTINATION bin)

下列cmake -Bbuild -H.命令没有显示错误,输出是

pi@homepi:~/Develop/CppMosquitto/example $ cmake -Bbuild -H.
-- The C compiler identification is GNU 6.3.0
-- The CXX compiler identification is GNU 6.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE  
-- Found PahoMqttC: /usr/local/lib/libpaho-mqtt3a.so  
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/Develop/CppMosquitto/example/build

下列cmake --build build/命令反而显示没有编译错误,但显示很多链接器错误

[ 50%] Linking CXX executable async_subscribe
CMakeFiles/async_subscribe.dir/async_subscribe.cpp.o: In function `main':
async_subscribe.cpp:(.text+0x154): undefined reference to `mqtt::connect_options::connect_options()'
async_subscribe.cpp:(.text+0x188): undefined reference to `mqtt::async_client::async_client(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mqtt::iclient_persistence*)'
async_subscribe.cpp:(.text+0x1b0): undefined reference to `mqtt::async_client::set_callback(mqtt::callback&)'
async_subscribe.cpp:(.text+0x1e0): undefined reference to `mqtt::connect_options::connect_options(mqtt::connect_options const&)'
async_subscribe.cpp:(.text+0x200): undefined reference to `mqtt::async_client::connect(mqtt::connect_options, void*, mqtt::iaction_listener&)'
async_subscribe.cpp:(.text+0x2e4): undefined reference to `mqtt::async_client::~async_client()'
async_subscribe.cpp:(.text+0x43c): undefined reference to `mqtt::async_client::~async_client()'
CMakeFiles/async_subscribe.dir/async_subscribe.cpp.o: In function `mqtt::async_client::disconnect()':
async_subscribe.cpp:(.text._ZN4mqtt12async_client10disconnectEv[_ZN4mqtt12async_client10disconnectEv]+0x2c): undefined reference to `mqtt::disconnect_options::disconnect_options()'
CMakeFiles/async_subscribe.dir/async_subscribe.cpp.o: In function `callback::reconnect()':
async_subscribe.cpp:(.text._ZN8callback9reconnectEv[_ZN8callback9reconnectEv]+0x68): undefined reference to `mqtt::connect_options::connect_options(mqtt::connect_options const&)'
collect2: error: ld returned 1 exit status
CMakeFiles/async_subscribe.dir/build.make:94: die Regel für Ziel „async_subscribe“ scheiterte
make[2]: *** [async_subscribe] Fehler 1
CMakeFiles/Makefile2:67: die Regel für Ziel „CMakeFiles/async_subscribe.dir/all“ scheiterte
make[1]: *** [CMakeFiles/async_subscribe.dir/all] Fehler 2
Makefile:127: die Regel für Ziel „all“ scheiterte
make: *** [all] Fehler 2

从PahoMqttCpp文档中,我了解到Cpp库需要PahoMqttC库。在 PahoMqttCpp 库的 CMakeLists.txt 文件中,C 部分包含在一行中find_package(PahoMqttC REQUIRED) (https://github.com/eclipse/paho.mqtt.cpp/blob/master/src/CMakeLists.txt第 26 行)。但这在第一个 cmake 命令中也会给我带来错误。

CMake Error at CMakeLists.txt:6 (find_package):
  By not providing "FindPahoMqttC.cmake" in CMAKE_MODULE_PATH this project
  has asked CMake to find a package configuration file provided by
  "PahoMqttC", but CMake did not find one.

  Could not find a package configuration file provided by "PahoMqttC" with
  any of the following names:

    PahoMqttCConfig.cmake
    pahomqttc-config.cmake

  Add the installation prefix of "PahoMqttC" to CMAKE_PREFIX_PATH or set
  "PahoMqttC_DIR" to a directory containing one of the above files.  If
  "PahoMqttC" provides a separate development package or SDK, be sure it has
  been installed.

添加一行set(CMAKE_MODULE_PATH /usr/local/lib/cmake/PahoMqttCpp)添加到 CMakeLists.txt 文件可以避免第一个 cmake 命令中的错误,但构建目录中的 make commnad 会失败并出现相同的未定义引用。

我缺少什么?我还没有在非常复杂的项目中使用过 cmake,但我认为我理解了建立一个简单项目的基本方法......直到现在。我非常感谢 cmake 专家的提示!

尝试第一个答案的方法后进行编辑

不幸的是,我仍然收到错误:

pi@homepi:~/Develop/CppMosquitto/example $ cmake -Bbuild -H.
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE  
-- Configuring done
CMake Error at CMakeLists.txt:10 (add_executable):
  Target "async_subscribe" links to target "PahoMqttCpp::PahoMqttCpp" but the
  target was not found.  Perhaps a find_package() call is missing for an
  IMPORTED target, or an ALIAS target is missing?


-- Generating done
-- Build files have been written to: /home/pi/Develop/CppMosquitto/example/build

Update

这是我目前的CMakeLists.txt file

cmake_minimum_required(VERSION 3.5)
find_package(PahoMqttCpp REQUIRED)
add_executable(async_subscribe async_subscribe.cpp)
target_link_libraries(async_subscribe PahoMqttCpp::PahoMqttCpp)
install(TARGETS async_subscribe RUNTIME DESTINATION bin)

这仍然会产生上面的错误,我不知道如何修复它。


我有同样的错误,我可能已经找到了解决方案。 请尝试按如下方式更改命令。

作为静态库;

target_link_libraries(async_subscribe PahoMqttCpp::paho-mqttpp3-static)

作为共享对象;

target_link_libraries(async_subscribe PahoMqttCpp::paho-mqttpp3)

您可以发现该库的名称如上所示\<prefix\>/lib/cmake/PahoMqttCpp/PahoMqttCppTargets.cmake.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Linux 上使用 cmake 独立编译 PahoMqttCpp 示例 的相关文章

  • 有没有办法将所有内容都包含在 dbcontext 中?

    当查询一个DbContext急切加载时 需要Include Navigation 为了填充导航属性 然而 在某些情况下 我想简单地Include all实体的导航属性 有没有办法做到这一点 或者有办法做到这一点 我假设你可以反思 但我宁愿避
  • 从数组中输入多个数字,每个数字检查是否为整数

    每个人 我希望有人能帮我弄清楚C语言的一些东西 这是我第一次认真地做IT方面的作业 我没有经验 而且我正在电子学习中学习 所以老师的帮助不是很好 我需要用C语言开发控制台应用程序 用户需要输入10个整数 如果插入的数字不是整数 需要输出错误
  • TCP客户端;网络流;异步读取; C#

    请原谅我对任务和异步缺乏了解 使用 TcpClient 类 我正在创建与可用服务器的连接 void async RunClientAsync TcpClient client new TcpClient try await client C
  • 以概率从列表中选择随机元素

    我有一个包含四个项目 A B C D 的列表 每个项目都有被选择的概率 例如 A 有 74 的机会被选中 B 15 C 7 D 4 我想创建一个函数 根据其概率随机选择一个项目 有什么帮助吗 为您的项目定义一个类 如下所示 class It
  • lambda 表达式到函数指针的转换

    这是这个问题的后续问题 Lambda 如何作为参数传递 https stackoverflow com questions 3321283 c0x lambda how can i pass as a parameter 据推测 MSDN
  • Visual Studio 2013 Intellisense 不会将枚举类型放在方法参数的位置

    例如 我有以下代码 namespace VS2013 EnumTypes class Program enum SomeEnum One Two static void SomeMethod SomeEnum someEnum some c
  • File.ReadAllLines 或流读取器

    我们可以使用以下方式读取文件StreamReader http msdn microsoft com en us library vstudio system io streamreader或通过使用File ReadAllLines ht
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • C语言中的array、&array、&array[0]有什么区别? [复制]

    这个问题在这里已经有答案了 在学习C语言中的数组和指针时 我很困惑 为什么ch ch ch 0 彼此相等 而sptr sptr sptr 0 却不相等 这是我的源代码 int main void char ch 7 1 2 3 4 5 6
  • 阻止用户取消选择列表框中的项目?

    我有一个列表框 里面有很多项目 用户可以单击某个项目来编辑其内容 如何防止用户取消选择所有项目 即 用户不应该无法选择任何内容 您的情况缺少一个案例 即清除列表后 您将选择列表中不再存在的项目 我通过添加额外的检查来解决这个问题 var l
  • 从 TFS 下载工作项附件(文件已损坏)

    我正在尝试创建 C 代码 因此我可以自动从 Team Foundation Server 下载 BUGS 预定义查询的所有附件 该代码似乎工作得很好 但所有下载的文件都因意外原因而损坏 我无法查看它们 有人可以看一下代码并分享意见吗 非常感
  • 将数组显式衰减为指针

    最简洁 最惯用的方式是什么明确地将数组衰减为指针 例如 考虑您需要能够指导 SFINAE 或明确过载的情况 template
  • 我的 Opencv 应用程序处理速度非常慢

    我正在构建一个 OpenCV 应用程序 它从相机捕获视频 并在删除背景后将其覆盖在另一个视频上 我无法达到合理的速度 因为它以大约 1 fps 的速度播放输出 而我的背景去除以 3 fps 的速度工作 有没有办法以正常速度显示背景视频并以
  • 如何将此 Boost ASIO 示例应用到我的应用程序中

    我已经阅读了很多 ASIO 示例 但我仍然对如何在我的应用程序中使用它们感到困惑 基本上 我的服务器端需要接受超过100个连接 客户端 这部分是通过使用线程池 通常每个CPU核心2 4个线程 来完成的 为简单起见 我们假设只有一个连接 为了
  • 仅最后一个用户控件显示内容控件

    我有一个奇怪的问题 我创建了一个带有标签和画布的用户控件 画布引用资源 但画布仅显示在我的堆栈面板中的最后一个控件上 这是我的窗户
  • 使用 System.Json 迭代 JSON

    我正在探索 NET 4 5 的功能System Json库 但没有太多文档 而且由于流行的 JSON NET 库 搜索起来相当棘手 我基本上想知道 我如何循环一些 JSON 例如 People Simon Age 25 Steve Age
  • 在 C++17 中编译具有非固定基础类型的 constexpr 从 int 静态转换为作用域枚举的未定义行为

    我想知道以下内容是否应该在 C 17 中编译 enum class E A B constexpr E x static cast
  • 恐怖分子已弃用

    正在接听另一个问题 https stackoverflow com q 11830514 1468366 我偶然发现了man page http linux die net man 3 herror一个名为的函数herror 看起来很像pe
  • 返回右值 - 这段代码有什么问题? [复制]

    这个问题在这里已经有答案了 我遇到了以下代码片段 std string test std string m Hello return std move m int main std string m test 我知道上面的代码是不正确且不安

随机推荐

  • ref($variable) 何时返回“IO”?

    这是文档的相关摘录ref功能 返回的值取决于引用所引用的事物的类型 内置类型包括 SCALAR ARRAY HASH CODE REF GLOB LVALUE FORMAT IO VSTRING Regexp 基于此 我想象调用ref在文件
  • Google Cloud Kubernetes Ingress 静态 IP 地址未反映且与设置不同

    我正在尝试在 Google Cloud 上使用 GKE 部署完整的 Web 应用程序 后端为 Nodejs 前端为 Angular 然后为其启用 SSL 我创建了一个全局 IP 地址 随后在列表中看到了它 gcloud 计算地址创建 mat
  • WCF工作流服务REST接口[重复]

    这个问题在这里已经有答案了 可能的重复 WF4 WCF 中的 RESTful 工作流服务端点 我正在尝试使 Windows Workflow Services 4 0 使用 REST 接口 我有一个非常简单的工作流服务 名为 Service
  • 加载谷歌地图时,Safari v5 隐藏 div

    我在 Mac 上使用 Safari v5 时遇到问题 当我的 Google Map Api 加载到页面中时 它隐藏了我的一些其他 div 它们是绝对定位的 在地图加载之前 页面会正确呈现 如果我有一个没有地图的页面 则不会发生问题 例子 w
  • 如何在运行时设置 JTextField 的宽度?

    有人可以帮我如何设置 a 的宽度吗JTextField在运行时 我希望在运行时调整我的文本字段的大小 它将询问用户长度 然后输入将更改文本字段的宽度 if selectedComponent instanceof javax swing J
  • 我正在尝试获取唯一的 CPU ID

    我使用下面的代码来获取唯一的 CPU ID 我在网上找到了使用此代码的各种示例 然而 一个偶然的机会 我碰巧拥有两台华硕笔记本电脑 一个是四核 i5 另一个是重型 i7 八核 两者都是 64 位机器 令我大吃一惊的是 它们都产生相同的 唯一
  • 如何在Powershell中解压文件?

    我有一个 zip文件 需要使用 Powershell 解压其全部内容 我正在这样做 但它似乎不起作用 shell New Object ComObject shell application zip shell NameSpace C a
  • 如何无限期删除 PouchDB 数据库以释放空间?

    如何删除 PouchDB 中的数据库以再次释放磁盘空间 删除仅设置参数 deleted 并保留记录的数据 但是 如何才能以真正删除记录并节省一些空间的方式删除记录呢 因为我想时不时地重置数据库 这样它就不会变得太大 听起来您正在寻找压实 它
  • 如何在asp.net中显示警告框

    我有一个带有提交按钮的注册页面 我想在 用户单击提交按钮 时显示一个警报框 然后 用户输入的数据被插入到数据库中 int i obj IU SubscriberMaster 0 txtFirstname Text txtLastname T
  • Python删除输入行

    我想在 python 3 中有一个输入循环 其中输入的信息会自动从终端删除 f eks 3秒后 我知道 r 的功能可以返回行 但在输入后很难自动换行 while True inputStr input Add the hidden word
  • 如何使用案例删除mysql中的重复项

    现在我正在使用类似的方法来删除 mysql 表中的重复项 delete t2 from my table1 as t1 my table1 as t2 where t1 TestCase t2 TestCase and t2 id gt t
  • 为 Razor 调整自定义 Html Helper(它使用 HtmlTextWriter 因此返回 void)

    问题 我有一个为 WebFormViewEngine 视图编写的非常漂亮的菜单 Html 帮助器 该引擎允许您的助手返回 void 但仍然能够使用 Html Theseus 这对我的助手来说非常有用 因为它可以使用 HtmlTextWrit
  • Python:使用批量 API V3 将订阅者添加到 mailchimp

    我试图编写一个函数来在 mailchimp 中创建订阅者 但出现错误 并且我不明白出了什么问题 我在用着python mailchimp 是的 我有正确的列表 ID 而不是 000000 My code from mailchimp3 im
  • Sequelize - findOrCreate 在“through”表上、belongsToMany 关联上

    首先 我对 Node JS 相当陌生 对 Sequelize 甚至更陌生 这已经困扰我一段时间了 我有以下模型实体 Match js module exports function sequelize DataTypes var Match
  • 禁用浏览器缓存

    Issue 我经常使用样式表 更改一些内容并检查它的外观 然而 大多数 如果不是全部 当前浏览器都会存储样式表 因此不会让我看到差异 只有在多次重置 Safari 后 按清空缓存按钮才会突然更新 但这确实很烦人 Question 有没有办法
  • Html & JS 点击时将图像旋转 90 度

    我试图在单击时向右旋转该图像每次单击 图像都会向右旋转 90 度 因此单击 4 次会将其恢复到原始位置 由于某种原因 将类 rotateimg90 分配给图像不起作用 function rotate90 alert rotate theIm
  • 在 matplotlib 中合并颜色图

    我想合并两个颜色图以生成 imshow 图 我想使用 RdBu 的范围 0 4 到 0 4 然后从 0 4 到最大值 比如 1 5 我想使用从相同的蓝色到另一种颜色 例如绿色 的渐变 我怎样才能做到这一点 这是我到目前为止所取得的进展 im
  • 如何将 @class 前向声明翻译为 Swift?

    我在 Objective C 中的 AppDelegate 中有 class PhoneViewController interface AppDelegate NSObject
  • 静态字段初始化顺序 (C#) - 有人可以解释这个片段吗?

    我是一名正在学习 C 的 C 程序员 我目前正在阅读 C 4 0 in a Nutshell 我在第 74 页看到了这个声明 片段 静态字段初始值设定项运行在 字段的顺序 宣布 下面的例子 说明了这一点 X 被初始化为 0 和 Y 初始化为
  • 在 Linux 上使用 cmake 独立编译 PahoMqttCpp 示例

    My goal 就是使用示例代码async subscribe cpp来自 PahoMqttCpp 项目 https github com eclipse paho mqtt cpp 作为一个独立的应用程序 然后根据我的需要对其进行修改 我