как скомпилировать репозиторий git в yocto с библиотекой jsoncpp?

Я написал рецепт для компиляции репозитория git в Yocto. Репозиторий содержит Makefile для компиляции кода. В первый раз мне удалось скомпилировать код в Yocto, но когда я добавил в свой код библиотеку jsoncpp, Yocto не смог ее скомпилировать. Он показывает какую-то ошибку, например

test_1.cpp:5:10: fatal error: jsoncpp/json/json.h: No such file or directory
|     5 | #include <jsoncpp/json/json.h>
|       |          ^~~~~~~~~~~~~~~~~~~~~

Вот мой файл рецепта. Пожалуйста, предложите мне изменение, которое мне нужно сделать, чтобы скомпилировать код.

yocto_test.bb

SUMMARY = "Hello World"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
DEPENDS = "jsoncpp"

SRCREV = "90052737ee51abca69a334a9208e2fec82d78c19"
SRC_URI = " \
    git://github.com/arghyaBiswas05/yocto-test.git \
    "

S = "${WORKDIR}/git/"

do_compile() {
    oe_runmake all
}

# Install binary to final directory /usr/bin
do_install() {
    install -d ${D}${bindir}
    install -m 0755 ${S}test_file ${D}${bindir}
}

Вот мой Makefile

all:
    ${CXX} test_1.cpp -o test_file $(shell pkg-config --cflags --libs jsoncpp)

install:
    cp test_file /usr/bin

clean:
    rm -rf test_file

Пожалуйста, предложите мне изменение.


person Arghya Biaswas    schedule 02.01.2021    source источник


Ответы (2)


В Makefile должны использоваться CXXFLAGS и LDFLAGS вместо жестко заданных JSONLIB. Эти две переменные соответственно устанавливаются Yocto и необходимы для поиска файлов, предоставляемых рецептами, которые у вас есть в DEPENDS.

Если я могу предложить, использование meson, autotools или cmake может помочь вам быстрее, чем писать Makefille вручную.

person qschulz    schedule 02.01.2021
comment
Большое спасибо. Я изменил Makefile по вашему предложению, и это сработало. - person Arghya Biaswas; 05.01.2021

Что выводит команда pkg-config --cflags --libs jsoncpp? Если вы запустите его из Yocto, что он напечатает? Вы можете попросить свой make-файл распечатать эту информацию, добавив что-то вроде этого в make-файл:

$(info args: $(shell pkg-config --cflags --libs jsoncpp))

Вероятно, он напечатает что-то, включая флаг -I/usr/include/jasoncpp. Если это так, то ваш #include неверен, потому что -I из /usr/include/jasoncpp плюс включение jasoncpp/json/json.h дает полный путь /usr/include/jasoncpp/jasoncpp/json/json.h, а этот файл явно не существует.

Я думаю, что, скорее всего, ваше включение должно быть #include <json/json.h>, но нет способа узнать наверняка, не зная, как установлен пакет jsoncpp, куда он помещает свои заголовки и какие флаги он ожидает.

person MadScientist    schedule 02.01.2021
comment
Это разумный ответ, но обратите внимание, что Yocto является системой кросс-компиляции, и запуск pkg-config в оболочке хоста сборки даст результаты, отличные от pkg-config, который используется во время сборки. - person Jussi Kukkonen; 03.01.2021
comment
Да, верно: вам нужно запустить pkg-config в той же среде, где вызывается make. - person MadScientist; 03.01.2021