Не удалось увеличить кросс-компиляцию во время компоновки (Ubuntu скомпилировано для Raspberry Pi) - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь выполнить кросс-компиляцию проекта c ++ на моем Ubuntu для запуска в Raspberry Pi. Однако по какой-то причине я не могу заставить работать мой make-файл.

Я сделал несколько вещей.

  1. У меня есть настройка среды для рук, с помощью которой я могу кросс-компилировать простой код (например, hello world) на моем компьютере и запускать в Raspberry Pi.
  2. Я скомпилировал 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 ++?

...