Вопрос или проблема
Я пытаюсь кросс-компилировать программу с библиотекой “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
-
Скачать исходный код
Получите исходный код библиотекиlibgpiod
либо через git, либо скачав его архив. Чтобы использовать его в вашем проекте, вы можете клонировать репозиторий:git clone https://git.kernel.org/pub/scm/libs/libgpiod.git cd libgpiod
-
Конфигурация сборки
Для конфигурации сборки используйте 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
-
Компиляция и установка
После успешной конфигурации сборки запустите команды:make make install
Это должно успешно установить библиотеку
libgpiod
в указанную вами директорию.
Шаг 3: Исправление ошибок
-
Ошибка "No such file or directory"
Если вы получаете ошибкуfatal error: gpiod.h: No such file or directory
, это может означать, что компилятор не знает, где искать библиотеку. Убедитесь, что ваша переменнаяINCLUDE
указывает на правильный путь, где находитсяgpiod.h
. -
Ошибка с
-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
и использовать её в своей программе. Если будут дополнительные вопросы или проблемы, не стесняйтесь задавать их. Успехов!