#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 или это ошибка компилятора.