#c #makefile #raspberry-pi #mqtt #mosquitto
#c #makefile #raspberry-pi #mqtt #mosquitto
Вопрос:
Я пытаюсь начать работу с библиотекой mosquitto MQTT (c , raspberry pi). Я думаю, что я успешно установил все нужные мне пакеты и смог собрать и выполнить включенный образец «temperature_conversion» без ошибок. Я получаю кучу предупреждений об устаревших функциях, но я игнорирую их как не часть непосредственной проблемы.
Хотя я и не совсем новичок, я не очень хорошо разбираюсь в инструментах разработки Linux и сборке / компоновке / MakeFiles. При попытке создать свой собственный автономный тест на основе примера, найденного здесь:
https://github.com/eclipse/mosquitto/tree/master/examples/temperature_conversion
Вывод при запуске ‘make’ (в моей измененной версии): [отредактировано, чтобы включить изменения на основе комментария JDAllen]
pi@raspberrypi:~/Documents/c/offgrid $ make
g main.o mqtt_manager.o -o offgrid -L/usr/local/lib/libmosquittopp.so.1 /usr/local/lib/libmosquitto.so.1
main.o: In function `main':
/home/pi/Documents/c/offgrid/main.cpp:8: undefined reference to `mosqpp::lib_init()'
/home/pi/Documents/c/offgrid/main.cpp:11: undefined reference to `mosqpp::mosquittopp::loop_forever(int, int)'
.
.
(Similar 'undefined reference' messages omitted for clarity)
.
.
collect2: error: ld returned 1 exit status
Makefile:11: recipe for target 'offgrid' failed
make: *** [offgrid] Error 1
Мой измененный MakeFile: [отредактировано, чтобы включить изменения на основе комментария JDAllen]
CFLAGS=-Wall -ggdb -I/usr/local/include
LDFLAGS=-L/usr/local/lib/libmosquittopp.so.1 /usr/local/lib/libmosquitto.so.1
.PHONY: all clean
all : offgrid
offgrid : main.o mqtt_manager.o
${CXX} $^ -o $@ ${LDFLAGS}
main.o : main.cpp
${CXX} -c $^ -o $@ ${CFLAGS}
mqtt_manager.o : mqtt_manager.cpp
${CXX} -c $^ -o $@ ${CFLAGS}
clean :
-rm -f *.o offgrid
НЕИЗМЕНЕННЫЙ пример MakeFile приложения:
CFLAGS=-Wall -ggdb -I../../lib -I../../lib/cpp
LDFLAGS=-L../../lib ../../lib/cpp/libmosquittopp.so.1 ../../lib/libmosquitto.so.1
.PHONY: all clean
all : mqtt_temperature_conversion
mqtt_temperature_conversion : main.o temperature_conversion.o
${CXX} $^ -o $@ ${LDFLAGS}
main.o : main.cpp
${CXX} -c $^ -o $@ ${CFLAGS}
temperature_conversion.o : temperature_conversion.cpp
${CXX} -c $^ -o $@ ${CFLAGS}
clean :
-rm -f *.o mqtt_temperature_conversion
Я проверил, что /usr/local/include содержит mosquittopp.h , а /usr/local/lib содержит libmosquittopp.so.1
Может кто-нибудь, пожалуйста, просветите меня о том, чего мне здесь не хватает? Я почти уверен, что смогу заставить его работать, скопировав структуру каталогов /lib из примера, но я хотел бы использовать ?установленный? версии в / usr, потому что это похоже на то, как нужно поступать с такими вещами.
[ПРАВКА1: теперь я убедился, что копирование /lib из каталога примера в мой собственный и замена первых двух строк в Makefile путями относительно этих каталогов действительно позволяет моему модифицированному коду строиться без вышеупомянутых ошибок. Я все еще хочу иметь возможность использовать файлы в /usr/local/lib, хотя — почему это не работает? Какие дальнейшие шаги я могу предпринять, чтобы увидеть, где что-то идет не так?]
По запросу я могу обновить это своим измененным кодом, но если я не сделал что-то глупое, это структурно эквивалентная сокращенная версия исходного примера, приведенного выше.
Комментарии:
1. Итак, пример приложения имеет «../../ lib/libmosquitto.so.1» в своих LDFLAGS, но в вашем он отсутствует. Может быть, недостающие функции находятся в этом файле библиотеки?? Почему вы это оставили? Вы также можете захотеть изменить заголовок своего сообщения, поскольку на самом деле вы задаете вопрос, отличный от того, что написано в заголовке.
2. @JDAllen Спасибо, что заметили это — хороший глаз. Действительно, я пропустил это где-то в своем цикле попыток итерации. Это было в более ранних версиях, и я забыл вставить его обратно перед публикацией кода. ОДНАКО результирующий результат остается тем же, что и при добавлении обратно. Можете ли вы предложить лучший заголовок для сообщения? Казалось, что это вопрос, который я должен задать, но вы не знаете, чего вы не знаете, верно?
3. Может быть, что-то вроде «Получение «неопределенной ссылки» при попытке скомпилировать код MQTT»??
Ответ №1:
Ну, я не совсем понимаю, что происходит в серверной части, но я смог выяснить, что работает, основываясь на другом обсуждении с той же / похожей проблемой здесь:
https://www.raspberrypi.org/forums/viewtopic.php?t=254740
В случае, если приведенная выше ссылка не работает, ниже приведен отрывок из этого обсуждения:
Если вы создаете некоторый код на C в качестве клиента, вам понадобится «-lmosquitto» в конце команды gcc. В нем говорится «используйте библиотеку libmosquitto», которая разрешит все эти недостающие символы. Обратите внимание, что это нижний регистр «-l», верхний регистр «-L» указывает путь поиска библиотеки. Используйте «-lmosquittopp», если вы создаете C . Вам потребуется установить пакеты клиентской библиотеки разработки mosquitto: libmosquitto-dev для C и / или libmosquittopp-dev для C .
После небольшого количества проб и ошибок я получил следующий Makefile, который, похоже, работает просто отлично:
LDFLAGS=-lmosquittopp
.PHONY: all clean
all : offgrid
offgrid : main.o mqtt_manager.o
${CXX} $^ -o $@ ${LDFLAGS}
main.o : main.cpp
${CXX} -c $^ -o $@ ${CFLAGS}
mqtt_manager.o : mqtt_manager.cpp
${CXX} -c $^ -o $@ ${CFLAGS}
clean :
-rm -f *.o offgrid