Перекрестная компиляция для RaspberryPi — включая библиотеки из синхронизированной файловой системы

#c #cmake #raspberry-pi #cross-compiling

#c #cmake #raspberry-pi #кросс-компиляция #перекрестная компиляция

Вопрос:

Я пытаюсь скомпилировать простой проект на своем ПК, чтобы начать работать с RaspberryPi. Я нашел несколько руководств в Интернете и создал файл cmake. Базовый файл cmake работает на стороне rpi, но при перекрестной компиляции дополнительного файла возникают некоторые проблемы. Make-файлы генерируются правильно, но при вызове make выдается сообщение о том, что он не может найти wiringPi.h библиотеку, которую я использую. Я синхронизировал /lib и / usr из rpi на свой компьютер.

Вот мой cmake для перекрестной компиляции.

 #info
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
# specify the cross compilers
SET(CMAKE_C_COMPILER
/home/voodoo16/raspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER
/home/voodoo16/raspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g  )
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /home/voodoo16/raspberryPi/fs)
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  

Конечно, я вызываю создание cmake через:

 cmake -DCMAKE_TOOLCHAIN_FILE=crossCompile.cmake .
  

Файлы существуют в папке fs. Вот вывод find:

 voodoo16@tesla:[~/raspberryPi/fs]$ find -name *wiringPi*
./usr/local/include/wiringPiSPI.h
./usr/local/include/wiringPi.h
./usr/local/include/wiringPiI2C.h
./usr/local/lib/libwiringPi.so
./usr/local/lib/libwiringPi.so.2.32
./usr/local/lib/libwiringPiDev.so
./usr/local/lib/libwiringPiDev.so.2.32
./usr/lib/libwiringPi.so
./usr/lib/libwiringPiDev.so
  

Я полагаю, что мне не хватает какой-то команды cmake, которая позволяет просматривать библиотеки из файловой системы rpi не через систему ПК, используя стандарт #include <lib.h> .

С наилучшими пожеланиями, voodoo16.

Ответ №1:

Вам нужно установить переменную CMake CMAKE_SYSROOT для компилятора подсказок о перекрестной компиляции:

 set(CMAKE_SYSROOT "/home/voodoo16/raspberryPi/fs")
  

Переменные CMake CMAKE_FIND_* влияют только на find_* команды CMake, они напрямую не указывают на компилятор. С другой стороны, CMAKE_SYSROOT переменные подсказки для find_* команд тоже.

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

1. Это работает, но есть другая проблема. Теперь он не может видеть <sys/cdefs.h> . Может ли это быть связано с проблемой cmake или с самим компилятором?

2. Вы уверены, что у вас есть этот заголовочный файл в sysroot?

3. voodoo16@tesla:[~/raspberryPi/fs]$ find . -name *cdefs.h* ./usr/include/arm-linux-gnueabihf/sys/cdefs.h

4. Возможно, вам нужно включить этот каталог вручную : include_directories("/usr/include/arm-linux-gnueabihf") .

5. Это не очень помогает. Набор include_directories("/home/voodoo16/raspberryPi/fs/usr/include/arm-linux-gnueabihf") . Устраняет отсутствие <sys/cdefs.h> . Затем он жалуется на отсутствие <gnu/stubs-soft.h> (черт возьми ??). Изменил его так, чтобы он всегда читался <gnu/stubs-hard.h> . И в финале он жалуется на отсутствие -lwiringPi . Так что, возможно, он все еще не видит fs или это ошибка компилятора.