无法在Visual Studio和vcpkg中构建cmake项目(严重错误C1083) [英] Cannot build a cmake project in Visual Studio and vcpkg (fatal error C1083)

查看:816
本文介绍了无法在Visual Studio和vcpkg中构建cmake项目(严重错误C1083)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我今天安装了vcpkg,启用了与Visual Studio的集成,即.\ vcpkg集成安装,并开始安装库.

I installed vcpkg today, enabled integration with Visual Studio, ie .\vcpkg integrate install, and started installing libraries.

我基本上安装了cpprestsdk并触发了Boost库的安装.然后,我在Visual Studio(CMake)中打开了项目.

I basically installed cpprestsdk and that trigger installation of boost libraries. Then I opened the project in the Visual Studio (CMake).

当我安装cpprestsdk时,我收到此消息:

When I installed cpprestsdk I received this message:

The package cpprestsdk:x86-windows provides CMake targets:

    find_package(cpprestsdk REQUIRED)
    # Note: 1 targets were omitted
    target_link_libraries(main PRIVATE cpprestsdk::cpprest cpprestsdk::cpprestsdk_boost_internal cpprestsdk::cpprestsdk_zlib_internal cpprestsdk::cp
prestsdk_openssl_internal)

The package cpprestsdk:x64-windows provides CMake targets:

    find_package(cpprestsdk REQUIRED)
    # Note: 1 targets were omitted
    target_link_libraries(main PRIVATE cpprestsdk::cpprest cpprestsdk::cpprestsdk_boost_internal cpprestsdk::cpprestsdk_zlib_internal cpprestsdk::cp
prestsdk_openssl_internal)

所以我的CMakeLists.txt

So my CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

project(CppRestSwaggerClient)

#find_package(Boost REQUIRED)

# THE LOCATION OF OUTPUT BINARIES
set(CMAKE_LIBRARY_DIR ${PROJECT_SOURCE_DIR}/lib)
set(LIBRARY_OUTPUT_PATH ${CMAKE_LIBRARY_DIR})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()


# Update require components as necessary
#find_package(Boost 1.45.0 REQUIRED COMPONENTS ${Boost_THREAD_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_DATE_TIME_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY})

find_package(cpprestsdk REQUIRED)

message("this is ${Boost_INCLUDE_DIRS}")

# build and set path to cpp rest sdk
set(CPPREST_ROOT ${PROJECT_SOURCE_DIR}/../../../vcpkg/packages/cpprestsdk_x86-windows)
set(CPPREST_INCLUDE_DIR ${CPPREST_ROOT}/include)
#set(CPPREST_LIBRARY_DIR ${CPPREST_ROOT}/lib)

include_directories(${PROJECT_SOURCE_DIR} api model ${CPPREST_INCLUDE_DIR} ${Boost_INCLUDE_DIRS})
#include_directories(${PROJECT_SOURCE_DIR} api model ${CPPREST_INCLUDE_DIR})


#SUPPORTING FILES
set(SUPPORTING_FILES  "ApiClient" "ApiConfiguration" "ApiException" "HttpContent" "IHttpBody" "JsonBody" "ModelBase" "MultipartFormData" "Object")
#SOURCE FILES
file(GLOB SOURCE_FILES  "api/*"  "model/*")

add_library(${PROJECT_NAME} ${SUPPORTING_FILES} ${SOURCE_FILES} )

但是,当我构建项目时,我遇到了一些关于boost的错误

However when I build the project I am taking some errors regarding boost

c:\ code \ cpprest-client \ multipartformdata.cpp(16):致命错误C1083: 无法打开包含文件:'boost/uuid/random_generator.hpp':否这样 文件或目录

c:\code\cpprest-client\multipartformdata.cpp(16): fatal error C1083: Cannot open include file: 'boost/uuid/random_generator.hpp': No such file or directory

c:\ code \ cpprest-client \ api \ userapi.h(36):致命错误C1083:无法 打开包含文件:'boost/optional.hpp':没有这样的文件或目录

c:\code\cpprest-client\api\userapi.h(36): fatal error C1083: Cannot open include file: 'boost/optional.hpp': No such file or directory

在我的Powershell中,我看到安装了那些库

In my powershell I see those libraries installed

PS C:\vcpkg\packages> ls .\boost-uuid_x86-windows


    Directory: C:\vcpkg\packages\boost-uuid_x86-windows

任何想法,怎么回事.我已经为此失去了几个小时.

Any ideas, what is going on. I have already lost hours with this.

Mode                LastWriteTime         Length Name                                                                                              
----                -------------         ------ ----                                                                                              
d-----        5/11/2018  11:47 AM                include                                                                                           
d-----        5/11/2018  11:47 AM                share                                                                                             
-a----        5/11/2018  11:47 AM             46 BUILD_INFO                                                                                        
-a----        5/11/2018  11:47 AM            405 CONTROL                                                                                           



PS C:\vcpkg\packages> ls .\boost-optional_x64-windows


    Directory: C:\vcpkg\packages\boost-optional_x64-windows


Mode                LastWriteTime         Length Name                                                                                              
----                -------------         ------ ----                                                                                              
d-----        5/11/2018   1:25 PM                include                                                                                           
d-----        5/11/2018   1:25 PM                share                                                                                             
-a----        5/11/2018   1:25 PM             46 BUILD_INFO                                                                                        
-a----        5/11/2018   1:25 PM            302 CONTROL                                                                                           

推荐答案

据我所知,您似乎只是忘记配置CMake工具链文件.启用vcpkg集成后,您应该已经收到一条消息,内容如下:

From what I can tell it looks like you just forgot to configure your CMake toolchain file. When you enabled the vcpkg integration, you should have gotten a message that said something like:

CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=(your vcpkg directory here)/scripts/buildsystems/vcpkg.cmake"

CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=(your vcpkg directory here)/scripts/buildsystems/vcpkg.cmake"

如果使用的是Visual Studio 2017,则只需转到顶部的CMake菜单,然后转到更改CMake设置",然后单击项目的名称.这将打开一个CMakeSettings.json文件.看起来像这样:

If you're using Visual Studio 2017, you just have to go to the CMake menu at the top, go down to "Change CMake Settings", and click on your project's name. This will open up a CMakeSettings.json file. It will look something like this:

{
  // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file.
  "configurations": [
    {
      "name": "x86-Debug",
      "generator": "Ninja",
      "configurationType": "Debug",
      "inheritEnvironments": [ "msvc_x86" ],
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": ""
    },
    {
      "name": "x86-Release",
      "generator": "Ninja",
      "configurationType": "Release",
      "inheritEnvironments": [ "msvc_x86" ],
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": ""
    },
    {
      "name": "x64-Debug",
      "generator": "Ninja",
      "configurationType": "Debug",
      "inheritEnvironments": [ "msvc_x64_x64" ],
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": ""
    },
    {
      "name": "x64-Release",
      "generator": "Ninja",
      "configurationType": "Release",
      "inheritEnvironments": [ "msvc_x64_x64" ],
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": ""
    },

要设置您的构建链,您将不得不让CMake知道vcpkg工具链文件在哪里.为此,请在所有四个配置的ctestCommandArgs下添加以下行.

To set up your buildchain, you're going to have to let CMake know where the vcpkg tool chain file is. To do this, add the following line under ctestCommandArgs for all four configurations.

"variables": [
  {
    "name": "CMAKE_TOOLCHAIN_FILE",
    "value": "<LOCATION OF THE FILE> (reintegrate vcpkg and it'll tell you again)"
  }
]

我还建议您执行以下操作:

I also recommend you do the following:

  • 将生成器从Ninja更改为Visual Studio
  • 为x64配置指定本地64位构建链
  • 删除构建命令args下的-v内容
  • Change the generator from Ninja to Visual Studio
  • Specify a native 64bit buildchain for the x64 configurations
  • Remove the -v thing under build command args

这是我的CMakeSettings.json文件的外观:

{
  // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file.
  "configurations": [
    {
      "name": "x86-Debug",
      "generator": "Visual Studio 15 2017",
      "configurationType": "Debug",
      "inheritEnvironments": [ "msvc_x86" ],
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "variables": [
        {
          "name": "CMAKE_TOOLCHAIN_FILE",
          "value": "C:/Source-Code/vcpkg/scripts/buildsystems/vcpkg.cmake"
        }
      ]
    },
    {
      "name": "x86-Release",
      "generator": "Visual Studio 15 2017",
      "configurationType": "Release",
      "inheritEnvironments": [ "msvc_x86" ],
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "variables": [
        {
          "name": "CMAKE_TOOLCHAIN_FILE",
          "value": "C:/Source-Code/vcpkg/scripts/buildsystems/vcpkg.cmake"
        }
      ]
    },
    {
      "name": "x64-Debug",
      "generator": "Visual Studio 15 2017 Win64",
      "configurationType": "Debug",
      "inheritEnvironments": [ "msvc_x64_x64" ],
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "cmakeCommandArgs": "-T host=x64",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "variables": [
        {
          "name": "CMAKE_TOOLCHAIN_FILE",
          "value": "C:/Source-Code/vcpkg/scripts/buildsystems/vcpkg.cmake"
        }
      ]
    },
    {
      "name": "x64-Release",
      "generator": "Visual Studio 15 2017 Win64",
      "configurationType": "Release",
      "inheritEnvironments": [ "msvc_x64_x64" ],
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "cmakeCommandArgs": "-T host=x64",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "variables": [
        {
          "name": "CMAKE_TOOLCHAIN_FILE",
          "value": "C:/Source-Code/vcpkg/scripts/buildsystems/vcpkg.cmake"
        }
      ]
    },
    {
      "name": "Linux-Debug",
      "generator": "Unix Makefiles",
      "remoteMachineName": "${defaultRemoteMachineName}",
      "configurationType": "Debug",
      "remoteCMakeListsRoot": "/var/tmp/src/${workspaceHash}/${name}",
      "cmakeExecutable": "/usr/local/bin/cmake",
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "remoteBuildRoot": "/var/tmp/build/${workspaceHash}/build/${name}",
      "remoteInstallRoot": "/var/tmp/build/${workspaceHash}/install/${name}",
      "remoteCopySources": true,
      "remoteCopySourcesOutputVerbosity": "Normal",
      "remoteCopySourcesConcurrentCopies": "10",
      "remoteCopySourcesMethod": "rsync",
      "remoteCopyBuildOutput": false,
      "cmakeCommandArgs": "",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "inheritEnvironments": [ "linux_x64" ]
    },
    {
      "name": "Linux-Release",
      "generator": "Unix Makefiles",
      "remoteMachineName": "${defaultRemoteMachineName}",
      "configurationType": "Release",
      "remoteCMakeListsRoot": "/var/tmp/src/${workspaceHash}/${name}",
      "cmakeExecutable": "/usr/local/bin/cmake",
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "remoteBuildRoot": "/var/tmp/build/${workspaceHash}/build/${name}",
      "remoteInstallRoot": "/var/tmp/build/${workspaceHash}/install/${name}",
      "remoteCopySources": true,
      "remoteCopySourcesOutputVerbosity": "Normal",
      "remoteCopySourcesConcurrentCopies": "10",
      "remoteCopySourcesMethod": "rsync",
      "remoteCopyBuildOutput": false,
      "cmakeCommandArgs": "",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "inheritEnvironments": [ "linux_x64" ]
    }
  ]
}

请注意,通过x64配置时,请使用-T host=x64命令行参数,并专门将生成器声明为Visual Studio 15 2017 Win64,而不只是声明为Visual Studio 15.如果您未指定本机x64主机,Visual Studio将默认为x86 .

Notice that the x64 configurations pass use the -T host=x64 command line argument, as well as specifically declaring the generator as Visual Studio 15 2017 Win64, rather than just Visual Studio 15. If you don't specify a native x64 host, Visual Studio will default to x86.







将文件设置为一种变通方法的问题(如果可以解决的话)是,由于您是专门指定目录之类的,因此您失去了在构建环境中使用构建系统的许多便利.第一名.

The problem with the way you set up your file as a work around (if it worked at all), is that since you were specifically specifying directories and whatnot, you lost a lot of the convenience of using a build system in the first place.

如果有机会,我真的建议您观看此视频有关如何操作有效地使用CMake.他谈到诸如不使用INCLUDE_DIRECTORIES命令之类的事情,因为该命令在目录级别有效,而不是基于每个目标.

When you get a chance, I really recommend you watch this video on how to use CMake effectively. He talks about things like not using the INCLUDE_DIRECTORIES command, because that command works at the directory level, rather than on a per-target basis.

我敢肯定,您只是为了使CMake正常工作而绝望地做了所有事情(我们都去过那里),但这是需要牢记的;当我第一次看到使用这些超级方便和有用的命令实际上对我造成的伤害大于好处时,这真让我大吃一惊.

I'm sure you only did all that out of desperation trying to get CMake to work (we've all been there), but it's something to keep in mind; it definitely blew my mind the first time I saw using those super convenient and helpful commands was actually doing me more harm than good.

例如,不是像在CMakeLists.txt中那样显式设置C ++标准标志,请下次尝试以下方法:

For example, rather than explicitly setting the C++ standard flag the way you did in your CMakeLists.txt, try this next time:

CMAKE_MINIMUM_REQUIRED (VERSION 3.8)
PROJECT (CppRestSwaggerClient VERSION 1.0.0 LANGUAGES CXX)

OPTION (TREAT_WARNINGS_AS_ERRORS "Treat warnings as errors" OFF)

SET_PROPERTY (CppRestSwaggerClient CXX_STANDARD 17)
SET_PROPERTY (CppRestSwaggerClient CXX_STANDARD_REQUIRED ON)

TARGET_COMPILE_FEATURES (CppRestSwaggerClient
    PRIVATE
        cxx_constexpr
)

您明白了.基本上,您只想配置您的项目,而不是自己实际设置标志,否则,您将变得越来越难以跟上项目的维护和配置.

You get the idea. Basically you want to only configure your project, not actually set the flags yourself, otherwise you're only making it harder for yourself to keep up with the maintenance and configuration of your project over time.

希望这会有所帮助,祝您好运!

Hope this helps, good luck!

这篇关于无法在Visual Studio和vcpkg中构建cmake项目(严重错误C1083)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆