I installed vcpkg today, enabled integration with Visual Studio, ie .\vcpkg integrate install, and started installing libraries.
I basically installed cpprestsdk and that trigger installation of boost libraries. Then I opened the project in the Visual Studio (CMake).
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)
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} )
However when I build the project I am taking some errors regarding boost
c:\code\cpprest-client\multipartformdata.cpp(16): fatal error C1083: Cannot open include file: 'boost/uuid/random_generator.hpp': No such file or directory
and
c:\code\cpprest-client\api\userapi.h(36): fatal error C1083: Cannot open include file: 'boost/optional.hpp': No such file or directory
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
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"
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:
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.I also recommend you do the following:
-v
thing under build command argsThis is how my
CMakeSettings.json
file looks:Notice that the x64 configurations pass use the
-T host=x64
command line argument, as well as specifically declaring the generator asVisual Studio 15 2017 Win64
, rather than justVisual 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.
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.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.
For example, rather than explicitly setting the C++ standard flag the way you did in your CMakeLists.txt, try this next time:
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!