Как сделать кросс-компиляцию приложения с библиотечными зависимостями для Yocto Linux? - PullRequest
0 голосов
/ 23 марта 2020

Я написал приложение на своем ноутбуке (Ubuntu 14.04), которое зависит от GStreamer и хотел бы кросс-компилировать его для моей цели Yocto Linux (iMX6S-Wandboard). Как выполнить кросс-компиляцию приложения, чтобы оно работало на целевой плате и могло использовать библиотеки GStreamer?

Спасибо,

Toan

UDPATE:

Мой Makefile:

PACKAGES            = gstreamer-1.0

override CFLAGS     += `pkg-config --cflags $(PACKAGES)` -Wall -Wextra "-DDATADIR=\"$(DATADIR)/\"" -ffunction-sections -fdata-sections
override LIBS       += `pkg-config --libs $(PACKAGES)`
override LDFLAGS    += -Wl,--gc-sections

OBJS    = basic-tutorial-7.o
DEPS    = $(foreach file,$(OBJS),$(basename $(file)).d)
EXE     = basic-tutorial-7

DESTDIR     ?=
PREFIX      ?=  $(HOME)/.local/
BINDIR      ?=  $(PREFIX)bin
DATADIR     ?=  $(PREFIX)share/$(PKGNAME)

.PHONY : clean install uninstall

all:    $(EXE)

$(EXE)  :   $(OBJS)
    $(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

$(OBJS) : %.o   :   %.c %.d
    @[ -d "$(@D)" ] || mkdir -p "$(@D)"
    $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

$(DEPS) : %.d : $(PROJECT_ROOT)%.c
    @[ -d "$(@D)" ] || mkdir -p "$(@D)"
    $(CC) $(CFLAGS) $(CPPFLAGS) -M -MF $@ -MT "$(basename $@).o" $<

clean:
    rm -fr $(EXE) $(OBJS) $(DEPS)

install : $(EXE)
    install -DT -m 0755 $(EXE) $(DESTDIR)$(BINDIR)/$(EXE)

uninstall :
    rm -v $(DESTDIR)$(BINDIR)/$(EXE)

ifneq ($(MAKECMDGOALS), clean)
-include $(DEPS)
endif

Мой * .bb файл:

DESCRIPTION = "Basic Tutorial 7"
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""

DEPENDS = "gstreamer1.0 pkgconfig-native gstreamer1.0-plugins-base"

FILES_${PN} += "${bindir}/basic-tutorial-7 ${bindir}/basic-tutorial-7"

EXTRA_OEMAKE += "DESTDIR=${D}/ DATADIR=${datadir}/basic-tutorial-7 BINDIR=${bindir}"

do_compile () {
    oe_runmake install
}

do_install () {
    oe_runmake clean
}

Журнал сборки:

$ devtool build basic-tutorial-7

NOTE: Starting bitbake server...
NOTE: Reconnecting to bitbake server...
NOTE: Retrying server connection (#1)...
Loading cache: 100% |############################################| Time: 0:00:00
Loaded 1298 entries from dependency cache.
Parsing recipes: 100% |##########################################| Time: 0:00:00
Parsing of 773 .bb files complete (772 cached, 1 parsed). 1299 targets, 63 skipped, 0 masked, 0 errors.
Loading cache: 100% |############################################| Time: 0:00:00
Loaded 1298 entries from dependency cache.
Parsing recipes: 100% |##########################################| Time: 0:00:00
Parsing of 773 .bb files complete (772 cached, 1 parsed). 1299 targets, 63 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Initialising tasks: 100% |#######################################| Time: 0:00:01
Sstate summary: Wanted 0 Found 0 Missed 0 Current 322 (0% match, 100% complete)
NOTE: Executing Tasks
NOTE: Setscene tasks completed
NOTE: Tasks Summary: Attempted 1480 tasks of which 1480 didn't need to be rerun and all succeeded.

Журнал развертывания:

$ devtool deploy-target basic-tutorial-7 root@192.168.0.101

NOTE: Starting bitbake server...
NOTE: Reconnecting to bitbake server...
NOTE: Retrying server connection (#1)...
Loading cache: 100% |############################################| Time: 0:00:00
Loaded 1298 entries from dependency cache.
Parsing recipes: 100% |##########################################| Time: 0:00:00
Parsing of 773 .bb files complete (772 cached, 1 parsed). 1299 targets, 63 skipped, 0 masked, 0 errors.
ERROR: No files to deploy - have you built the basic-tutorial-7 recipe? If so, the install step has not installed any files.

1 Ответ

1 голос
/ 25 марта 2020

Yocto eSDK позволяет вам кросс-компилировать приложения для вашей цели Yocto на вашем P C, используя именно тот компилятор и библиотеки, которые используются для самой цели. Нет необходимости добавлять G CC к цели. ESDK может быть сгенерирован из дерева исходных текстов Yocto, но, поскольку у вас в любом случае установлен исходный код, вам не нужно устанавливать eSDK, и его можно собирать непосредственно из источника. Все это не спецификация ARM c, а общий рабочий процесс Yocto для кросс-компиляции для указанной цели c Yocto.

Для этого сначала настройте среду сборки Yocto как обычно, изменив ее на каталог Yocto с именем source setup-environment yourbuilddir.

Затем выполните команду devtool add, передайте имя приложения (будет использовано для рецепта BitBake) и путь к существующему источнику. дерево, например:

devtool add myhelloworld /home/user/Projects/myhelloworld

Это автоматически сгенерирует рецепт и добавит слой с именем workspace в ваше исходное дерево Yocto. Рецепт будет называться примерно как /yocto/source/path/yourbuilddir/workspace/recipes/myhelloworld/myhelloworld.bb. Вы можете отредактировать его, запустив

devtool edit-recipe myhelloworld

Перед командой добавьте что-то вроде EDITOR=gedit, чтобы использовать ваш любимый текстовый редактор. Измените рецепт, чтобы правильно построить приложение; BitBake автоматически определит, запускать ли make или CMake. Пример использования make:

DESCRIPTION = "My GStreamer Hello World"
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""

DEPENDS = "gstreamer1.0 pkgconfig-native"
FILES_${PN} += "${bindir}/myhelloworld ${datadir}/myhelloworld"

EXTRA_OEMAKE += "DESTDIR=${D}/ DATADIR=${datadir}/myhelloworld BINDIR=${bindir}"

do_install() {
    oe_runmake install
}

do_clean() {
    oe_runmake clean
}

DEPENDS перечисляет зависимости, я добавил gstreamer1.0, а также pkgconfig-native, что необходимо при использовании pkg-config внутри Makefile. Вы можете добавить дополнительные зависимости к DEPENDS, если они вам нужны, например boost openssl. Подходящим примером make-файла будет:

PACKAGES            = gstreamer-1.0

override CFLAGS     += `pkg-config --cflags $(PACKAGES)` -Wall -Wextra "-DDATADIR=\"$(DATADIR)/\"" -ffunction-sections -fdata-sections
override LIBS       += `pkg-config --libs $(PACKAGES)`
override LDFLAGS    += -Wl,--gc-sections

OBJS    = main.o
DEPS    = $(foreach file,$(OBJS),$(basename $(file)).d)
EXE     = myhelloworld

DESTDIR     ?=
PREFIX      ?=  $(HOME)/.local/
BINDIR      ?=  $(PREFIX)bin
DATADIR     ?=  $(PREFIX)share/$(PKGNAME)

.PHONY : clean install uninstall

all:    $(EXE)

$(EXE)  :   $(OBJS)
    $(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

$(OBJS) : %.o   :   %.c %.d
    @[ -d "$(@D)" ] || mkdir -p "$(@D)"
    $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

$(DEPS) : %.d : $(PROJECT_ROOT)%.c
    @[ -d "$(@D)" ] || mkdir -p "$(@D)"
    $(CC) $(CFLAGS) $(CPPFLAGS) -M -MF $@ -MT "$(basename $@).o" $<

clean:
    rm -fr $(EXE) $(OBJS) $(DEPS)

install : $(EXE)
    install -DT -m 0755 $(EXE) $(DESTDIR)$(BINDIR)/$(EXE)

uninstall :
    rm -v $(DESTDIR)$(BINDIR)/$(EXE)

ifneq ($(MAKECMDGOALS), clean)
-include $(DEPS)
endif

Внутри вашего Makefile убедитесь, что make install устанавливает двоичный файл вашего приложения в $(DESTDIR)$(BINDIR)/myhelloworld и файлы данных (например, изображения) в $(DESTDIR)$(DATADIR)/somefile. На цели ваш двоичный файл будет расположен в /usr/bin/myhelloworld, а файлы данных в /usr/share/myhelloworld. В Makefile передайте "-DDATADIR=\"$(DATADIR)/\"" компилятору, чтобы вы могли открыть свои файлы данных, например, fopen(DATADIR "somepic.png", "rb");. Для исходного файла main.c вы можете использовать GStreamer, пример 1 .

Сохраните рецепт, Makefile и main.c, а затем запустите

devtool build myhelloworld

, чтобы скомпилировать ваше приложение. Если все идет хорошо, вы можете установить его на цель с помощью S SH, запустив, например,

devtool deploy-target myhelloworld root@targethostname

Затем вы можете S SH к цели и запустить свое приложение, набрав myhelloworld. Чтобы удалить его:

devtool undeploy-target myhelloworld root@targethostname

Если позже вы решите отправить свое приложение как часть образа Yocto, измените рецепт для образа вашей системы и добавьте:

IMAGE_INSTALL_append = " yourhelloworld"

Оставьте место после первой цитаты. При создании изображения ваше приложение и данные будут включены. Основное преимущество этого подхода (с использованием рецепта BitBake) состоит в том, что добавление приложения к изображению становится легким и что приложение будет связано с точно теми библиотеками, которые доступны на цели, поэтому вы можете использовать именно те функции, которые присутствуют в этих версиях. .

Используя приведенный выше пример make-файла, вы также можете напрямую скомпилировать хост P C, просто запустив make.

.
...