Скомпилируйте образец PahoMqttCpp как автономный с cmake в Linux - PullRequest
0 голосов
/ 22 апреля 2019

Моя цель

... - использовать образец кода 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) я следовал описанию в файле README.md PahoMqttCpp. Я скомпилировалуспешно 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.В файлах CMakeLists.txt из библиотеки PahoMqttCpp часть 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

Обновление

Это мой текущий CMakeLists.txt файл

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)

, который по-прежнему выдает ошибку выше, и я не знаю, как ее исправить.

1 Ответ

0 голосов
/ 22 апреля 2019

Сценарий PahoMqttCppConfig.cmake делает НЕ переменные типа PahoMqttCpp_LIBRARIES или PahoMqttCpp_INCLUDE_DIRS.

Вместо этого он предоставляет IMPORTED target PahoMqttCpp::PahoMqttCpp, который представляет библиотеку PahoMqttCpp. Использовать эту цель просто:

# This provides both include directories and linked libraries
target_link_libraries(async_subscribe PahoMqttCpp::PahoMqttCpp)

По аналогии импортируемая цель PahoMqttC::PahoMqttC предоставляется для чистого кода C. Эта библиотека связывается автоматически, когда один связывается с C ++, один PahoMqttCpp::PahoMqttCpp.

...