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

#git #makefile #yocto #recipe #jsoncpp

#мерзавец #makefile создать файл #йокто #рецепт #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
 

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

Ответ №1:

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

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

Комментарии:

1. Большое спасибо. Я изменил Makefile по вашему предложению, и это сработало.

Ответ №2:

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

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

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

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

Комментарии:

1. Это разумный ответ, но обратите внимание, что Yocto — это система кросс-компиляции, и запуск pkg-config в командной оболочке узла сборки даст результаты, отличные от результатов pkg-confg, которые используются во время сборки

2. Да, верно: вам нужно запустить pkg-config в той же среде, где вызывается make.