Я пытаюсь выполнить кросс-компиляцию проекта c ++ на моем Ubuntu для запуска в Raspberry Pi. Однако по какой-то причине я не могу заставить работать мой make-файл.
Я сделал несколько вещей.
- У меня есть настройка среды для рук, с помощью которой я могу кросс-компилировать простой код (например, hello world) на моем компьютере и запускать в Raspberry Pi.
- Я скомпилировал boost с помощью arm gcc и g ++, с методами, найденными здесь: https://github.com/Yadoms/yadoms/wiki/Cross-compile-for-raspberry-PI
В основном это
nano ~/user-config.jam
using gcc : arm : arm-linux-gnueabihf-g++ ;
./b2 --with-atomic --with-chrono --with-date_time --with-filesystem --with-regex --with-serialization --with-thread --with-system --no-samples --no-tests toolset=gcc-arm link=static cxxflags=-fPIC
Тем не менее, он всегда терпел неудачу при соединении
Пример, который я использовал здесь:
#include <wiringPi.h>
#include <boost/filesystem.hpp>
#include <iostream>
#include <string>
int main (void)
{
boost::filesystem::create_directory("testFolder");
wiringPiSetup() ;
pinMode(0, OUTPUT) ;
for(;;)
{
digitalWrite (0, HIGH) ; delay (500) ;
digitalWrite (0, LOW) ; delay (500) ;
}
std::cout<<"hello world"<<std::endl;
return 0 ;
}
Я протестировал библиотеку wiringPi, она работает нормально
И CMakeLists.txt
cmake_minimum_required(VERSION 3.0.0)
project(ExoController)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -pthread -lwiringPi -o3") #you can set with add_definitions("-Wall -std=c+11, etc")
set(Boost_USE_STATIC_LIBS ON)
set(Boost_INCLUDE_DIR /home/lowlimb/rpi-kernel/boost_1_71_0)
set(Boost_LIBRARY_DIR /home/lowlimb/rpi-kernel/boost_1_71_0/stage/lib)
set(CMAKE_SYSROOT /home/lowlimb/rpi-kernel/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/sysroot)
set(CMAKE_C_COMPILER /home/lowlimb/rpi-kernel/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /home/lowlimb/rpi-kernel/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++)
# Search for programs only in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Search for libraries and headers only in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(Include_DIR include)
find_package(Boost 1.71.0 COMPONENTS serialization date_time filesystem REQUIRED)
if(NOT Boost_FOUND)
message(FATAL_ERROR "boost cannot be found")
endif()
#set(Eigen_INCLUDE_DIR /home/pi/Lib/eigen-eigen-323c052e1731)
#wiringPi library libwiringPi.so
set (WPI_PATH /home/lowlimb/rpi-kernel/WiringPi/wiringPi)
# Actually find the wiringPi library object
find_library(WPI_LIB wiringPi HINTS ${WPI_PATH} NO_CMAKE_FIND_ROOT_PATH)
# Alert the user if we do not find it
if(NOT WPI_LIB)
message(FATAL_ERROR “wiringPi library not found”)
endif()
include_directories(
${Boost_INCLUDE_DIR}
${WPI_PATH}
)
link_directories(${WPI_PATH} ${Boost_LIBRARY_DIR})
enable_testing()
add_executable(exo_o main.cpp)
target_link_libraries(exo_o PRIVATE ${WPI_PATH} ${Boost_LIBRARIES})
Вывод, который я получил при make:
CMake Warning at /usr/share/cmake-3.10/Modules/FindBoost.cmake:801 (message):
New Boost version may have incorrect or missing dependencies and imported
targets
Call Stack (most recent call first):
/usr/share/cmake-3.10/Modules/FindBoost.cmake:907 (_Boost_COMPONENT_DEPENDENCIES)
/usr/share/cmake-3.10/Modules/FindBoost.cmake:1558 (_Boost_MISSING_DEPENDENCIES)
CMakeLists.txt:29 (find_package)
CMake Warning at /usr/share/cmake-3.10/Modules/FindBoost.cmake:801 (message):
New Boost version may have incorrect or missing dependencies and imported
targets
Call Stack (most recent call first):
/usr/share/cmake-3.10/Modules/FindBoost.cmake:907 (_Boost_COMPONENT_DEPENDENCIES)
/usr/share/cmake-3.10/Modules/FindBoost.cmake:1558 (_Boost_MISSING_DEPENDENCIES)
CMakeLists.txt:29 (find_package)
CMake Warning at /usr/share/cmake-3.10/Modules/FindBoost.cmake:801 (message):
New Boost version may have incorrect or missing dependencies and imported
targets
Call Stack (most recent call first):
/usr/share/cmake-3.10/Modules/FindBoost.cmake:907 (_Boost_COMPONENT_DEPENDENCIES)
/usr/share/cmake-3.10/Modules/FindBoost.cmake:1558 (_Boost_MISSING_DEPENDENCIES)
CMakeLists.txt:29 (find_package)
CMake Warning at /usr/share/cmake-3.10/Modules/FindBoost.cmake:801 (message):
New Boost version may have incorrect or missing dependencies and imported
targets
Call Stack (most recent call first):
/usr/share/cmake-3.10/Modules/FindBoost.cmake:907 (_Boost_COMPONENT_DEPENDENCIES)
/usr/share/cmake-3.10/Modules/FindBoost.cmake:1558 (_Boost_MISSING_DEPENDENCIES)
CMakeLists.txt:29 (find_package)
-- Boost version: 1.71.0
-- Found the following Boost libraries:
-- serialization
-- date_time
-- filesystem
-- system
-- Configuring done
WARNING: Target "exo_o" requests linking to directory "/home/lowlimb/rpi-kernel/WiringPi/wiringPi". Targets may link only to libraries. CMake is dropping the item.
-- Generating done
-- Build files have been written to: /home/lowlimb/Documents/testCode/build
Scanning dependencies of target exo_o
[ 50%] Building CXX object CMakeFiles/exo_o.dir/main.cpp.o
[100%] Linking CXX executable exo_o
/home/lowlimb/rpi-kernel/boost_1_71_0/stage/lib/libboost_filesystem.a(operations.o): In function `boost::filesystem::detail::current_path(boost::system::error_code*)':
operations.cpp:(.text+0xbe): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned int, unsigned int, char const*, unsigned int)'
operations.cpp:(.text+0x140): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned int, unsigned int, char const*, unsigned int)'
(большую часть ошибки я исключаю, поскольку они выглядят как похожая ошибка). Я действительно не понимаю, почему make-файл не может правильно скомпилировать boost. Он нашел правильную версию надстройки, которую я использовал (оригинальная версия, которую я установил на этом компьютере, была 1.6, только версия руки 1.71.0), почему он все еще не может работать должным образом?
Дополнительная информация
Я хотел бы добавить дополнительную информацию к этому вопросу, когда я впервые делаю проект, что-то, что я считаю неправильным, обнаружилось
-- The C compiler identification is GNU 7.4.0
-- The CXX compiler identification is GNU 7.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Однако в моем CMakeLists.txt я уже назначил другой компилятор cxx, почему он все еще использовал / usr / bin / c ++?