Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio CMake项目使用外部SDK工具链文件交叉编译错误_Visual Studio_Cmake_Sdk_Cross Compiling_Yocto - Fatal编程技术网

Visual studio CMake项目使用外部SDK工具链文件交叉编译错误

Visual studio CMake项目使用外部SDK工具链文件交叉编译错误,visual-studio,cmake,sdk,cross-compiling,yocto,Visual Studio,Cmake,Sdk,Cross Compiling,Yocto,我的目标是使用Linux机器上构建的外部SDK工具链交叉编译Windows上存在的应用程序,以便为我的ARM平台提供可执行代码 我正在Windows机器上使用VisualStudio CMake项目 我使用的是外部SDK,以便 >交叉编译我的C++程序,用于Linux ARM架构>/P> 我已经在我的Linux机器上使用Yocto项目构建了这个SDK(不是ARM平台!) 我的Linux机器上的CMake工具链文件路径是: /opt/poky-atmel/2.5.3/sysroot/x86_64-

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

我正在Windows机器上使用VisualStudio CMake项目

<>我使用的是<强>外部SDK<强>,以便<强> >交叉编译我的C++程序,用于Linux ARM架构>/P> 我已经在我的Linux机器上使用Yocto项目构建了这个SDK不是ARM平台!

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

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

我可以看到,在以下路径下,我的SDK可能会使用多个交叉编译器:

/opt/poky-atmel/2.5.3/sysroot/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi

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

在将此交叉编译器的路径包含到我的VisualStudioCMakeSettings文件中之前,我尝试在我的Linux机器(它承载我的SDK)上使用它,以便编译简单代码并在ARM平台上执行。我成功地做到了

有一点需要注意的是,我必须源代码并设置环境,以便导出SDK工具链的重要路径和变量,以便编译代码

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

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

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

您可以在这里看到使用Boost库的myc++.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: ");
}
这是我的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 path设置为CMAKE\u CXX\u 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无法找到其他一些东西:

这是我的CMakeCache文件,在这里您可以看到我的项目使用了哪些变量(编译器和其他东西…):

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

我将感谢你的帮助

谢谢大家!

编辑

我添加日志文件:

以下是CMakeError.log文件:

以下是CMakeOutput.log文件:


我猜这里的OEToolchainConfig.cmake文件使用环境变量来查找目标系统根,
$ENV{OECORE\u target\u sysroot}
部分,这就是它不工作的原因

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


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

对于前面的问题,您说过,在设置工具链文件时,不应手动设置编译器。为什么您坚持要设置编译器?如果编译器不是由工具链设置的,那么问题将出现在工具链或环境设置中。您显示使用的文件
OEToolchainConfig.cmake
包含一些信息:它
include()
-s似乎执行详细设置的其他文件,但我们不知道这些文件的内容。@Tsyvarev当我做出上一个回答中描述的内容时,CMake项目根本不识别编译器,CMake_CXX_编译器使用的是默认VS编译器:
CMake_CXX_编译器=/usr/bin/c++
,这就是我不接受答案的原因。我认为问题出在环境设置中,但我无法理解
OEToolchainConfig.cmake
中写了什么,这就是为什么我不知道该做什么和修改什么,正如我从您的回答中所理解的,我必须首先找出这些值在我的Linux机器上的位置
CMAKE\u C\u FLAGS CMAKE\u CXX\u FLAGS OECORE\u TARGET\u SYSROOT OECORE\u NATIVE\u SYSROOT SDKTARGETSYSROOT
,然后编写脚本,然后在我的CMAKE项目中输入它们的值。这就是重点吗?在linux机器上,编写环境脚本的源代码,然后执行
echo$CFLAGS
并记录值。然后将OEToolchainCOnfig.cmake中的
$ENV{CFLAGS}
替换为从
echo
获得的值。对cxflags、OECORE\u TARGET\u SYSROOT、OECORE\u NATIVE\u SYSROOT、SDKTARGETSYSROOT重复上述操作。您可以在这里看到我如何修改此链接()中的
OEToolchainConfig.cmake
文件,您可以在这里看到我从visual studio获得的新消息:()。他
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