#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.