Проект CMake, использующий внешнюю ошибку кросс-компиляции файла инструментария SDK - PullRequest
4 голосов
/ 21 февраля 2020

Моя цель - сделать кросс-компиляцию приложения, существующего на Windows, с использованием внешнего набора инструментов SDK, который собирается на машине Linux, чтобы получить исполняемый код для моей платформы ARM

Я использую VisualStudio CMake project на Windows машине .

Я использую внешний SDK для кросс-компиляции моего C ++ программа для Linux arm архитектуры .

Я собрал этот SDK , используя Yocto project на моей Linux машине ( НЕ ПЛАТФОРМА ОРУЖИЯ! )

Мой Файл CMake toolchain Путь на моей Linux машине :

/ opt / poky-atmel / 2.5.3 / sysroots / x86_64-pokysdk-linux / usr / share / cmake / OEToolchainConfig.cmake

Я вижу, что есть несколько кросс-компиляторов, которые может быть использован моим SDK по этому пути:

/ opt / poky-atmel / 2.5.3 / sysroots / x86_64-pokysdk-linux / usr / bin / arm-poky- linux - гнуаби

Я могу упомянуть arm-poky- linux -gnueabi-g cc компилятор, который я хочу использовать для кросс-компиляции моего приложения и выполнения его на моей ARM платформе .

Прежде чем включить путь этого кросс-компилятора в мой файл VisualStudio CMakeSettings , я попытался использовать его на моей Linux машине (на которой размещен мой SDK), чтобы скомпилировать простой код и выполнить его на платформе ARM. Мне удалось это сделать!

Небольшое замечание о том, что Я должен создать и настроить среду для экспорта важных путей и переменных набора инструментов SDK, чтобы я мог скомпилировать свой код .

Теперь после того, как я был уверен в хорошей работе моего кросс-компилятора SDK, я должен использовать его в VisualStudio на моей машине windows, и это для той же цели (кросс-компиляция моего кода для использования его в моей архитектуре ARM) .

После открытия проекта CMake в VisualStudio и , подключающегося к моей Linux системе , выполните следующие действия:

Удаленное подключение

Я изменил все настройки, необходимые для достижения моей цели.

Здесь вы можете увидеть мои c ++ . cpp код файла, который использует библиотеку Boost:

#include "CMakeProject4.h"
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

using namespace std;

int main()
{
    typedef std::istream_iterator<int> in;

    std::cout << "Type in any number: ";

    std::for_each(
        in(std::cin), in(), std::cout
        << (boost::lambda::_1 * 10)
        << "\nType in another number: ");
}

Это мой CMakeList.txt :

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED OFF)  
set(Boost_USE_STATIC_RUNTIME OFF)

list(APPEND CMAKE_PREFIX_PATH /opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/include)
set(Boost_NO_BOOST_CMAKE ON)

message(STATUS "CMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'")
set(CROSS_COMPILER_DIR /opt/poky-atmel/2.5.3/sysroots/x86_64-pokysdk-linux/usr)
set(CMAKE_C_COMPILER ${CROSS_COMPILER_DIR}/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILER_DIR}/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc)


message(STATUS "CMAKE_C_COMPILER='${CMAKE_C_COMPILER}'")
message(STATUS "CMAKE_CXX_COMPILER='${CMAKE_CXX_COMPILER}'")

find_package(Boost 1.66.0) 

if(Boost_FOUND)

    message (STATUS "success!")
    add_executable (CMakeProject4 "CMakeProject4.cpp" "CMakeProject4.h") 
    include_directories(${Boost_INCLUDE_DIRS})  
    target_link_libraries(CMakeProject4 ${Boost_LIBRARIES})

endif()

Это мой CMakeSettings. json file:

{
  "configurations": [
    {
      "addressSanitizerRuntimeFlags": "detect_leaks=0",
      "buildCommandArgs": "",
      "cmakeCommandArgs": "cmake -DBoost_DEBUG=ON -DCMAKE_CXX_COMPILER=/opt/poky-atmel/2.5.3/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc",
      "cmakeExecutable": "/home/ubuntu/CMake/Executable",
      "cmakeToolchain": "/opt/poky-atmel/2.5.3/sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake",
      "configurationType": "RelWithDebInfo",
      "ctestCommandArgs": "",
      "generator": "Unix Makefiles",
      "inheritEnvironments": [ "linux_arm" ],
      "name": "Linux-Release",
      "remoteBuildRoot": "/home/ubuntu/CMake/RemoteBR",
      "remoteCMakeListsRoot": "/home/ubuntu/CMake/RemoteCML",
      "remoteCopyBuildOutput": false,
      "remoteCopySources": true,
      "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ],
      "remoteCopySourcesMethod": "rsync",
      "remoteInstallRoot": "/home/ubuntu/CMake/RemoteIL",
      "remoteMachineName": "867574967;192.168.1.12 (username=ubuntu, port=22, authentication=PrivateKey)",
      "rsyncCommandArgs": "-t --delete --delete-excluded",
      "variables": [
        {
          "name": "Boost_INCLUDE_DIRS",
          "value": "/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/include",
          "type": "PATH"
        },
        {
          "name": "Boost_LIBRARIES",
          "value": "/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/lib",
          "type": "PATH"
        },
        {
          "name": "Boost_INCLUDE_DIR",
          "value": "/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/include",
          "type": "PATH"
        }

      ]
    }
  ]
}

Как видите, я устанавливаю мои компиляторы SDK пути к CMAKE_CXX_COMPILER переменной.

Это также OEToolchainConfig.cmake файл, который я нахожу на моей машине Linux:

set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_C_FLAGS $ENV{CFLAGS} CACHE STRING "" FORCE )
set( CMAKE_CXX_FLAGS $ENV{CXXFLAGS}  CACHE STRING "" FORCE )
set( CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "" FORCE )
set( CMAKE_LDFLAGS_FLAGS ${CMAKE_CXX_FLAGS} CACHE STRING "" FORCE )

set( CMAKE_FIND_ROOT_PATH $ENV{OECORE_TARGET_SYSROOT} $ENV{OECORE_NATIVE_SYSROOT} )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )

# Set CMAKE_SYSTEM_PROCESSOR from the sysroot name (assuming processor-distro-os).
if ($ENV{SDKTARGETSYSROOT} MATCHES "/sysroots/([a-zA-Z0-9_-]+)-.+-.+")
  set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_MATCH_1})
endif()

# Include the toolchain configuration subscripts
file( GLOB toolchain_config_files "${CMAKE_TOOLCHAIN_FILE}.d/*.cmake" )
foreach(config ${toolchain_config_files})
    include(${config})
endforeach()

Я установил окружение на моей машине Linux и затем пытаюсь скомпилировать.

Это команда , которую я использую для компиляции своего кода:

cmake -DBoost_DEBUG=ON -DCMAKE_CXX_COMPILER=/opt/poky-atmel/2.5.3/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc

Но это сообщение приходит от CMake о том, что не работает компилятор, и о некоторых других вещах, которые CMake не может найти:

Сообщение CMake

Это мой файл CMakeCache , где вы можете увидеть, какие переменные (компиляторы и другие вещи ..) используются моим проектом:

CMakeCache

Первый Я полагаю, что среда не была настроена правильно, или VisualStudio не видит переменную среды после получения среды с моего компьютера Linux. Это просто мнение. Я действительно не знаю, в чем здесь проблема и почему я не могу скомпилировать свой код.

Буду признателен за вашу помощь!

Спасибо!

РЕДАКТИРОВАТЬ

Я добавляю файлы журнала:

Вот файл CMakeError.log:

CMakeError.log

Вот файл CMakeOutput.log:

CMakeOutput.log

1 Ответ

0 голосов
/ 21 февраля 2020

Я полагаю, что файл OEToolchainConfig.cmake использует переменные среды для поиска, например, целевой sys root, части $ENV{OECORE_TARGET_SYSROOT}, и поэтому он не работает.

Вы пишете, что Вы установили сценарий настройки среды на своем компьютере linux, но это не окажет никакого влияния на среду, когда вы пытаетесь собрать из VS Windows.

. Или посмотрите, есть ли способ, которым вы можете сделать сборку через VS, используя скрипт среды, или просто посмотреть, какие значения переменные окружения, используемые в OEToolchainConfig.cmake, имеют на компьютере linux после получения сценария установки, и заменить части $ ENV {} OEToolchainConfig.cmake вместо реальных значений.

...