2016-12-22 10 views
0

Когда я запустил catkin_make, я понял, что он должен автоматически скопировать файлы заголовков, которые я включил в основной файл cpp, в devel и создать исполняемый файл, однако это не делая этого.catkin_make не удалось создать исполняемый файл и автоматически скопировать файлы заголовков в 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 (каталог). Если я создам dir mqtt_pub_node и поместил в него свой файл заголовка, catkin_make будет успешным, но исполняемый файл не будет создан.

[EDIT] Файлы заголовков должны быть скопированы в 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}) 

бы оценить руководство, спасибо!

[EDIT] Ошибка из раствора задается 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 

ответ

0

С сережкой вы обычно не нужно 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.

+0

Здравствуйте, спасибо за Ваш ответ! Мой исходный файл Cmake был тем, что вы предложили, но это не сработало. Вот почему я пошел онлайн, чтобы исследовать возможные способы решения моей проблемы. Прикрепленная ошибка от вашего предложения. Он не может ссылаться на функции, которые находятся в файле заголовка mosquitto.h. – cechsterRK

+0

отредактировал выше в вопросе – cechsterRK

+0

Существует недостающая библиотека, на которую вы должны ссылаться. Является ли комара москитом? Если это так, добавьте его как зависимость от кошки. Если вы создаете его самостоятельно в своем CMakeLists.txt, добавьте что-то вроде 'target_link_libraries (mqtt_pub_node mosquitto $ {catkin_LIBRARIES})'. – cassinaj

0

Решено. При использовании 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}) 
+0

Вот что я сказал в своем комментарии ниже: 'target_link_libraries (mqtt_pub_node mosquitto $ {catkin_LIBRARIES})' – cassinaj

 Смежные вопросы

  • Нет связанных вопросов^_^