Невозможно собрать проект cmake в Visual Studio и vcpkg (фатальная ошибка C1083) - PullRequest
0 голосов
/ 11 мая 2018

Сегодня я установил vcpkg, включил интеграцию с Visual Studio, т. Е. \ Vcpkg integrate install, и начал установку библиотек.

В основном я установил cpprestsdk, и это вызывает установку библиотек наддува.Затем я открыл проект в 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 / extra.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                                                                                           

1 Ответ

0 голосов
/ 16 июня 2018

Из того, что я могу сказать, похоже, что вы просто забыли настроить файл инструментария CMake. Когда вы включили интеграцию vcpkg, вы должны были получить сообщение вроде:

CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=(your vcpkg directory here)/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)"
  }
]

Я также рекомендую вам сделать следующее:

  • Изменить генератор с ниндзя на Visual Studio
  • Укажите встроенную 64-битную сборочную цепочку для конфигураций x64
  • Удалите -v вещь из команды сборки 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 .




Проблема с тем, как вы настроили свой файл как обходной путь (если он вообще работал), заключается в том, что, поскольку вы конкретно указывали каталоги и тому подобное, вы потеряли много удобства использования системы сборки в первое место.

Когда вы получаете шанс, я очень рекомендую посмотреть это видео о том, как эффективно использовать CMake. Он говорит о таких вещах, как не использовать команду INCLUDE_DIRECTORIES, потому что эта команда работает на уровне каталога, а не на уровне цели.

Я уверен, что вы сделали все это из отчаяния, пытаясь заставить CMake работать (мы все были там), но об этом нужно помнить; это определенно поразило меня, когда я впервые увидел, что использование этих супер удобных и полезных команд на самом деле приносит мне больше вреда, чем пользы.

Например, вместо того, чтобы явно устанавливать стандартный флаг C ++, как вы делали это в вашем CMakeLists.txt, попробуйте это в следующий раз:

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
)

Вы поняли идею. По сути, вы хотите всего лишь настроить вашего проекта, а не сами устанавливать флаги, в противном случае вы только усложняете для себя возможность поддерживать и настраивать ваш проект с течением времени.

Надеюсь, это поможет, удачи!

...