我的目标是使用在 Linux 机器上构建的外部 SDK 工具链交叉编译 Windows 上存在的应用程序,以便为我的 ARM 平台提供可执行代码

在 Windows 机器上使用VisualStudio CMake 项目

我正在使用外部 SDK交叉编译我的 C++ 程序,用于 Linux arm 架构

我已经在我的Linux 机器上使用Yocto 项目构建了这个SDK不是 ARM 平台!

我的Linux 机器上的CMake 工具链文件路径是:

/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-gnueabi

我可以提到arm-poky-linux-gnueabi-gcc编译器,我想用它来交叉编译我的应用程序并在我的ARM 平台上执行它。

在将这个交叉编译器的路径包含到我的 VisualStudio CMakeSettings 文件之前,我尝试在我的 Linux 机器(托管我的 SDK)上使用它,以便编译一个简单的代码并在 ARM 平台上执行它。 我已经成功做到了!

有一点需要说明的是,我必须获取和设置环境才能导出 SDK 工具链的重要路径和变量,以便我可以编译我的代码

现在,在我确定我的 SDK 交叉编译器的良好工作之后,我必须在我的 Windows 机器上的 VisualStudio 中使用它,这是出于同样的目的(交叉编译我的代码以便在我的 ARM 架构上使用它)。

VisualStudio上打开CMake 项目并按照以下步骤连接到我的 Linux 系统后:

远程连接

我已经修改了我需要的所有设置,以实现我的目标。

您可以在这里看到我使用 Boost 库的c++ .cpp 文件代码:

#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文件:

{
  "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 编译器 bin 路径设置为CMAKE_CXX_COMPILER变量。

这也是我在 Linux 机器上找到的OEToolchainConfig.cmake文件:

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 文件,您可以在其中查看我的项目使用的变量(编译器和其他东西..):

缓存

我猜的第一件事是,环境设置不正确,或者 VisualStudio 在从我的 Linux 机器上获取环境后没有看到环境变量。 这只是一个意见。 我真的不知道这里有什么问题以及为什么我不能编译我的代码。

我将感谢您的帮助!

谢谢!

编辑

我添加日志文件:

这是 CMakeError.log 文件:

CMakeError.log

这是 CMakeOutput.log 文件:

CMakeOutput.log

#1楼 票数:0

我的猜测是 OEToolchainConfig.cmake 文件使用环境变量来查找例如目标 sysroot、 $ENV{OECORE_TARGET_SYSROOT}部分,这就是它不起作用的原因。

您写道,您已经在 linux 机器上获取了环境设置脚本,但是当您尝试从 Windows 中的 VS 构建时,这不会对环境产生任何影响。

看看是否有一种方法可以让您通过 VS 使用环境脚本进行构建,或者在获取安装脚本后简单地查看 OEToolchainConfig.cmake 中使用的环境变量在 linux 机器上的值,并替换 $ENV{}使用实际值代替 OEToolchainConfig.cmake 的部分。

  ask by Gonn translate from so

未解决问题?本站智能推荐:

1回复

使用外部 SDK 工具链文件在 VisualStudio 上的 CMake 项目编译错误

我在Windows机器上使用VisualStudio CMake 项目。 我正在使用外部SDK来交叉编译我的Linux arm 架构的C++程序。 我将 SDK 工具链添加到 cmakeToolchain 路径,即: /opt/poky-atmel/2.5.3/sysroots/x86_64
2回复

带有 cmake 工具链文件的 Yocto SDK

我提供了一个 Yocto SDK 来为嵌入式目标交叉构建应用程序。 应用程序本身是使用 CMake 构建的。 SDK 安装脚本提供了许多必要的环境变量(如交叉编译器的位置、sysroot 等),到目前为止,这些变量足以构建应用程序。 但是,由于最近该应用程序依赖于 Boost 库(通过 CMak
1回复

Visual Studio 和 Yocto Linux 交叉编译

我正在尝试为 Yocto 的远程 Linux 构建设置 Visual Studio,但遇到了一些奇怪的问题。 我已经在 WSL 上安装了 yocto SKD 并修改了 PATH 变量以默认包含编译器的路径(通过 ~/.bashrc 文件)。 所以我的 PATH 变量看起来像: 当我运行编译器时
2回复

CMake 交叉编译 Windows 到 Windows

有没有人试过,在 cmake 中将 Windows 交叉编译到 Windows? 我有一个异国情调的场景。 我正在参与一个用 cmake 构建的开源项目。 该项目有几个平台端口。 例如。 Windows、Linux 等。每个平台都有自己的 cmake 下标,有些还有单独的工具链脚本。 我想添加
1回复

Yocto填充SDK-Receipe从cmake继承

我使用cmake构建我的源代码。 它取决于名为“ spdlog”的软件包。 我想使用yocto生成SDK。 使用populate_sdk正确生成了SDK,但SDK中未附带spdlog配置cmake文件。 我的收据: 但是,我们安装了我的SDK并尝试使用它来编译我的代码,但由于以
1回复

如何用Yocto构建包含CMake的SDK?

我想为我的嵌入式系统分发交叉编译工具链(SDK)。 我创建了一个自己的图层,其中包含所有的lib等。 输入: 我可以生成一个工具链,其中包含所有头文件和库。 现在我想要不仅包括lib而且还包括cmake。 怎么做?
1回复

如何在Windows和CMake上使用Visual Studio编译Mac OS X的C ++

我了解到Visual Studio现在支持跨平台开发 。 到目前为止,我正在使用CMake为Windows和Ubuntu (使用WSL )进行编译。 但是,关于如何实际使用Visual Studio到Mac OS X的交叉编译似乎没有任何信息。 CMakeSettings.json是否可以
1回复

如何解决使用CMAKE 3.4.1和VS2015用其他模型编译opencv3.0时找不到包含文件的问题

使用CMAKE 3.4.1和VS2015构建OPENCV 3.0时。 VS2015出现以下错误: 我认为问题可能出在“ opencv2 / core / hal / intrin.hpp”和“ opencv2 / core / hal / hal.hpp”。 但是,在指定包含文件之后