Как изменить MakeFile, чтобы использовать локально установленные библиотеки вместо исходного относительного пути?

#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