Моя цель - сделать кросс-компиляцию приложения, существующего на 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