catkin_make 无法创建可执行文件并自动复制头文件到devel

Posted

技术标签:

【中文标题】catkin_make 无法创建可执行文件并自动复制头文件到devel【英文标题】:catkin_make unable to create executable and automatically copy header files to devel 【发布时间】:2016-12-22 02:29:29 【问题描述】:

当我运行我的 catkin_make 时,我知道它应该自动将我包含在主 cpp 文件中的头文件复制到 devel 并创建一个可执行文件,但是它没有这样做。

错误:

Linking CXX executable /home/catkin_ws/devel/lib/mqtt_pub/mqtt_pub_node
/usr/bin/ld: cannot find -lmosquitto.h
collect2: error: ld returned 1 exit status
make[2]: *** [/home/catkin_ws/devel/lib/mqtt_pub/mqtt_pub_node] Error 1
make[1]: *** [mqtt_pub/CMakeFiles/mqtt_pub_node.dir/all] Error 2
make: *** [all] Error 2
Invoking "make -j1 -l1" failed

请注意,mqtt_pub_node 不存在。为什么它要寻找不存在的东西?它应该是自动创建的。据我所知,可执行文件应该在 devel/lib/mqtt_pub 中,不确定系统在哪里考虑 mqtt_pub_node(directory)。如果我创建 dir mqtt_pub_node 并将我的头文件放入其中,则 catkin_make 成功,但不会创建可执行文件。

[编辑] 头文件应该复制到devel/include,但是在我的catkin_ws 上,没有这样的目录。

Cmakelist

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES mqtt_pub
  CATKIN_DEPENDS roscpp std_msgs
  DEPENDS system_lib
)

include_directories(
  $catkin_INCLUDE_DIRS
  /catkin_ws/src/mqtt_pub/include/mqtt_pub
  include
)

link_directories(
  /catkin_ws/src/mqtt_pub/include/mqtt_pub
)

link_libraries(
  mosquitto.h
)

add_executable(mqtt_pub_node src/mqtt_publish.cpp)
target_link_libraries(mqtt_pub_node $catkin_LIBRARIES)

不胜感激,谢谢!

[编辑] cassinaj 给出的解决方案出错

CMakeFiles/mqtt_pub_node.dir/src/mqtt_publish.cpp.o: In function `main':
mqtt_publish.cpp:(.text+0x1f8): undefined reference to `mosquitto_lib_init'
mqtt_publish.cpp:(.text+0x210): undefined reference to `mosquitto_new'
mqtt_publish.cpp:(.text+0x237): undefined reference to   `mosquitto_username_pw_set'
mqtt_publish.cpp:(.text+0x259): undefined reference to `mosquitto_connect'
mqtt_publish.cpp:(.text+0x285): undefined reference to `mosquitto_loop_start'
mqtt_publish.cpp:(.text+0x2bc): undefined reference to `mosquitto_publish'
mqtt_publish.cpp:(.text+0x2d0): undefined reference to `mosquitto_loop_stop'
mqtt_publish.cpp:(.text+0x2df): undefined reference to `mosquitto_disconnect'
mqtt_publish.cpp:(.text+0x2ee): undefined reference to `mosquitto_destroy'
mqtt_publish.cpp:(.text+0x2f3): undefined reference to `mosquitto_lib_cleanup'
collect2: error: ld returned 1 exit status
make[2]: *** [/home/lorawan/catkin_ws/devel/lib/mqtt_pub/mqtt_pub_node] Error 1
make[1]: *** [mqtt_pub/CMakeFiles/mqtt_pub_node.dir/all] Error 2
make: *** [all] Error 2
Invoking "make -j1 -l1" failed

【问题讨论】:

【参考方案1】:

对于catkin,您通常不需要link_directories(...),也不需要导致您的问题的link_libraries(mosquitto.h)。对于后者,您告诉 cmake 将所有库和可执行文件链接到名为 mosquitto.h 的库,该库不是库,而只是头文件。 尝试以下方法:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

catkin_package(
  INCLUDE_DIRS include
  # LIBRARIES mqtt_pub
  CATKIN_DEPENDS roscpp std_msgs
)

include_directories(
  $catkin_INCLUDE_DIRS
  /catkin_ws/src/mqtt_pub/include/mqtt_pub
  include
)

add_executable(mqtt_pub_node src/mqtt_publish.cpp)
target_link_libraries(mqtt_pub_node $catkin_LIBRARIES)

请注意,我注释掉了LIBRARIES mqtt_pub 行,因为这要求您实际构建一个名为mqtt_pub 的库。

【讨论】:

您好,感谢您的回复!我最初的 Cmake 文件是你建议的,但它不起作用。这就是为什么我上网研究解决问题的可能方法。附件是您的建议中的错误。无法引用 mosquitto.h 头文件中的函数。 缺少一个需要链接的库。蚊子是柳絮包吗?如果是,则将其添加为 catkin 依赖项。如果您在 CMakeLists.txt 中自己构建它,请添加类似 target_link_libraries(mqtt_pub_node mosquitto $catkin_LIBRARIES) 的内容。【参考方案2】:

解决了。使用 Mosquitto 时,我必须在我的 CMakeList 中链接客户端库。基本上是 libmosquitto.so 文件,它是客户端库。

我将以下内容添加到我的 cmake 列表中:

set(Mosquitto_libs
  /usr/lib/x86_64-linux-gnu/libmosquitto.so
  /usr/lib/x86_64-linux-gnu/libmosquitto.so.1
)
target_link_libraries(mqtt_pub_node $catkin_LIBRARIES $Mosquitto_libs)

【讨论】:

这正是我在下面的评论中所说的:target_link_libraries(mqtt_pub_node mosquitto $catkin_LIBRARIES)

以上是关于catkin_make 无法创建可执行文件并自动复制头文件到devel的主要内容,如果未能解决你的问题,请参考以下文章

Catkin_make 不更新我保存的 python 文件

关闭并重新启动可执行文件后,无法修改或删除由我的 .jar 可执行文件创建的文本文件

Web 可访问复选标记

无法在 Linux 上使用 pyinstaller 和 cefpython 创建可执行文件(ICU 数据的文件描述符无效)

如何用cmake搭建ros工程,make编译而不是catkin_make

智能网联汽车 — 自动/辅助驾驶技术