Пересоберите библиотеку libgpiod и используйте её в своей программе.

Вопрос или проблема

Я пытаюсь кросс-компилировать программу с библиотекой “gpiod”.

Мой локальный ПК работает на Ubuntu 18.04, а целевая платформа, для которой я кросс-компилирую, – это плата с IMX8X SOM.

Я нашел исходный код по адресу https://variwiki.com/index.php?title=MX8_GPIO&release=RELEASE_DUNFELL_V1.3_VAR-SOM-MX8X и хотел бы его скомпилировать, следуя пункту “2.2 libgpiod C Application”. Операционная система, используемая на моей плате, – это дистрибутив “dunfell”, скомпилированный с Yocto. Кросс-компилятор, который я использую, также создан как sdk в среде Yocto (aarch64-fslc-linux-gcc).

Когда я скомпилировал, я сначала получил

"фатальная ошибка: gpiod.h: Нет такого файла или каталога"

Таким образом, эта библиотека не включена по умолчанию в предоставленный инструментальный набор. Поэтому я попробовал установить (кросс)библиотеку на своем ПК, следуя инструкциям на https://www.beyondlogic.org/an-introduction-to-chardev-gpio-and-libgpiod-on-the-raspberry-pi/, но это не сработало. Вторая ошибка, которую я получаю, это

/opt/fslc-wayland/3.1/sysroots/x86_64-fslcsdk-linux/usr/libexec/aarch64-fslc-linux/gcc/aarch64-fslc-linux/9.3.0/real-ld: не удается найти -lgpiod
collect2: ошибка: ld вернул статус выхода 1

Вот мои флаги компиляции:

CFLAGS = -Wall -I$(INCLUDE) --sysroot=${SDKTARGETSYSROOT} -Og -lgpiod

Я новичок в подобного рода вопросах и надеюсь, что делаю тривиальные ошибки. Заранее спасибо, если кто-то сможет помочь!

В системе android, пожалуйста, используйте android ndk

export PATH=$PATH:/home/semilog/Android/android-ndk-r23b/toolchains/llvm/prebuilt/linux-x86_64/bin

./autogen.sh –enable-tools=yes –host=armv8 CC=aarch64-linux-android24-clang –with-sysroot=/home/semilog/Android/android-ndk-r23b/toolchains/llvm/prebuilt/linux-x86_64/sysroot –prefix=/home/semilog/work/kernel/out

Сначала вручную удалите program_invocation_name из исходного кода.

make all install

export PATH=$PATH:/opt/arm-gcc/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/

закомментируйте AC_FUNC_MALLOC в configure.ac

./autogen.sh --enable-tools=yes --host=armv8 CC=aarch64-linux-gnu-gcc --prefix=/home/semilog/work/kernel/out

make all install

Ответ или решение

Чтобы кросс-компилировать библиотеку libgpiod и использовать её в вашей программе, необходимо следовать нескольким шагам. Давайте рассмотрим все необходимые детали и возможные ошибки, которые могут возникнуть в процессе.

Шаг 1: Подготовка среды

Вы уже упомянули, что ваш хост-пк работает на Ubuntu 18.04, а целевой платформой является плата IMX8X с операционной системой Dunfell, собранной с помощью Yocto. Для кросс-compilation вам понадобится соответствующий кросс-компилятор, который обычно предоставляется в SDK от Yocto.

Убедитесь, что у вас установлен кросс-компилятор aarch64-fslc-linux-gcc, который вы можете проверить, выполнив следующую команду в терминале:

aarch64-fslc-linux-gcc --version

Название должно соответствовать версии, которую вы используете в вашей среде Yocto.

Шаг 2: Сборка libgpiod

  1. Скачать исходный код
    Получите исходный код библиотеки libgpiod либо через git, либо скачав его архив. Чтобы использовать его в вашем проекте, вы можете клонировать репозиторий:

    git clone https://git.kernel.org/pub/scm/libs/libgpiod.git
    cd libgpiod
  2. Конфигурация сборки
    Для конфигурации сборки используйте auto-скрипт. Важно указать правильные параметры для кросс-компиляции:

    ./autogen.sh --enable-tools=yes --host=aarch64-fslc-linux CC=aarch64-fslc-linux-gcc --prefix=/path/to/your/install

    Убедитесь, что вы установили --with-sysroot:

    --with-sysroot=/opt/fslc-wayland/3.1/sysroots/aarch64-fslc-linux
  3. Компиляция и установка
    После успешной конфигурации сборки запустите команды:

    make
    make install

    Это должно успешно установить библиотеку libgpiod в указанную вами директорию.

Шаг 3: Исправление ошибок

  1. Ошибка "No such file or directory"
    Если вы получаете ошибку fatal error: gpiod.h: No such file or directory, это может означать, что компилятор не знает, где искать библиотеку. Убедитесь, что ваша переменная INCLUDE указывает на правильный путь, где находится gpiod.h.

  2. Ошибка с -lgpiod
    Ошибка cannot find -lgpiod указывает на то, что компилятор не может найти библиотеку libgpiod. Убедитесь, что путь к библиотеке правильно указан в переменной LIBRARY_PATH. Для этого добавьте в свои флаги компиляции:

    LDFLAGS = -L/path/to/your/install/lib

    Вместе с добавлением библиотек можно комбинировать флаги:

    CFLAGS = -Wall -I$(INCLUDE) --sysroot=${SDKTARGETSYSROOT} -Og
    LDFLAGS = -L/path/to/your/install/lib

Шаг 4: Использование библиотеки в вашей программе

После установки libgpiod в вашу целевую директорию, вы можете использовать библиотеку в вашем проекте. Убедитесь, что при компиляции вашей программы вы также добавляете -lgpiod к флагам компоновщика. Полный пример команды компиляции может выглядеть так:

aarch64-fslc-linux-gcc your_program.c -o your_program $(CFLAGS) $(LDFLAGS) -lgpiod

Заключение

Кросс-компиляция может быть сложной задачей, особенно для новичков. Очень важно внимательно настраивать окружение и следить за путями включения и библиотек. Надеюсь, эти шаги помогут вам успешно кросс-компилировать библиотеку libgpiod и использовать её в своей программе. Если будут дополнительные вопросы или проблемы, не стесняйтесь задавать их. Успехов!

Оцените материал
Добавить комментарий

Капча загружается...