无法在Visual Studio和vcpkg中构建cmake项目(致命错误C1083)

3
我今天安装了vcpkg,并启用了与Visual Studio的集成,即.\vcpkg integrate install,然后开始安装库。
我基本上安装了cpprestsdk,这触发了boost库的安装。然后我在Visual Studio(CMake)中打开了项目。
当我安装cpprestsdk时,我收到了以下消息:
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
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的错误。

c:\code\cpprest-client\multipartformdata.cpp(16): 致命错误 C1083: 无法打开包括文件: 'boost/uuid/random_generator.hpp': 没有那个文件或目录

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

在我的powershell中,我看到这些库已经安装了。

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


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

有什么想法,到底出了什么问题。我已经因此浪费了几个小时。

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                                                                                           

以下答案解决了我的问题:https://dev59.com/CW865IYBdhLWcg3wR8eh#3917033 - Michael Armitage
1个回答

4
据我所知,看起来你只是忘记配置CMake工具链文件了。当你启用vcpkg集成时,应该会收到一条消息,内容类似于:
CMake项目应使用: “-DCMAKE_TOOLCHAIN_FILE=(你的vcpkg目录)/scripts/buildsystems/vcpkg.cmake”
如果你正在使用Visual Studio 2017,你只需要在顶部的CMake菜单中找到“更改CMake设置”,然后点击你的项目名称。这将打开一个CMakeSettings.json文件。它会看起来像这样:
{
  // 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
"variables": [
  {
    "name": "CMAKE_TOOLCHAIN_FILE",
    "value": "<LOCATION OF THE FILE> (reintegrate vcpkg and it'll tell you again)"
  }
]

我建议您执行以下操作:
  • 将生成器从Ninja更改为Visual Studio
  • 为x64配置指定本机64位构建链
  • 删除构建命令参数下的-v内容

这是我的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




“你用的文件解决方案存在问题(如果它真的有效),因为你明确指定了目录等内容,失去了使用构建系统的许多便利性。”
“有机会的话,我强烈推荐你观看这个视频,了解如何有效地使用CMake。他谈到了一些事情,比如不要使用INCLUDE_DIRECTORIES命令,因为该命令在目录级别上工作,而不是在每个目标基础上。”
“我确定你只是出于绝望尝试让CMake工作(我们都曾经历过这种情况),但这是需要记住的;当我第一次看到使用那些非常方便和有用的命令实际上对我更有害而不是有益时,我感到震惊。”
“例如,下次尝试时,不要像你在CMakeLists.txt中所做的那样明确设置C ++标准标志,请尝试以下操作:”
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
)

你应该只想要配置你的项目,而不是自己设置标志。否则,随着时间的推移,这将使得维护和配置项目变得更加困难。希望这能帮到你,祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接