更改Visual Studio目标时,CMake无法找到增强功能

问题描述

我正在遵循https://badprog.com/c-boost-setting-up-on-windows-10的指示。我已安装Visual Studio 2017,并安装了boost_1_71_0-msvc-14.1-64.exe。 CMake已从cmake.org/download/cmake-3.19.0-rc1-win64-x64.msi下载。

我有一个需要Boost Beast的项目,我认为它是1.70或更高版本。

我运行cmake .时一切正常:

C:\Users\Public\xyz>cmake .
-- Building for: Visual Studio 16 2019
-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.18362.
-- The CXX compiler identification is MSVC 19.24.28314.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for C++ include pthread.h
-- Looking for C++ include pthread.h - not found
-- Found Threads: TRUE
-- Found Boost: C:/local/boost_1_71_0 (found suitable version "1.71.0",minimum required is "1.70") found components: thread system chrono date_time atomic
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/Public/xyz

生成的项目在Visual Studio 2017中打开,但随后抱怨它需要2019生成工具。令人惊讶的是,正如您在上面看到的那样,它是为Visual Studio 2019构建的吗?

但是,在杀死CMakeCache.txt和CMakeFiles之后,如果我这样做:

C:\Users\Public\xyz>cmake -G "Visual Studio 15 2017" .
-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.18362.
-- The CXX compiler identification is MSVC 19.16.27034.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for C++ include pthread.h
-- Looking for C++ include pthread.h - not found
-- Found Threads: TRUE
CMake Error at C:/Program Files/CMake/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
  Could NOT find Boost (missing: thread system) (found suitable version
  "1.71.0",minimum required is "1.70")
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:577 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files/CMake/share/cmake-3.19/Modules/FindBoost.cmake:2176 (find_package_handle_standard_args)
  CMakeLists.txt:29 (FIND_PACKAGE)


-- Configuring incomplete,errors occurred!
See also "C:/Users/Public/xyz/CMakeFiles/CMakeOutput.log".

突然找不到Boost组件(但可以找到Boost吗?)。我尝试了各种形式的-DBOOST_LIBRARYDIR-DBOOST_ROOT等,但都无济于事,但是我似乎没有cmake无法找到Boost的通常的stackoverflow问题。相反,尽管已为msvc-14.1安装了它,但似乎无法识别Visual Studio 2017目标?

CMakeLists.txt:

# Specify the minimum version for CMake
cmake_minimum_required(VERSION 3.1)

# Force C++11,for Boost Beast (async http library) 
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_required ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Project's name
project(xyz
        VERSION 0.1
        LANGUAGES CXX)

# Set the output folder where the program will be created
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})

# Specify .cpp and .hpp is in src/
set(PROJECT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/src)
include_directories("${PROJECT_SOURCE_DIR}")

# Add source to build target for hello world...
add_executable(main ${PROJECT_SOURCE_DIR}/main.cpp)

# Testing http support
ADD_EXECUTABLE( server ${PROJECT_SOURCE_DIR}/server.cpp )

FIND_PACKAGE( Boost 1.70 required COMPONENTS thread system )
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_Dirs} )
target_link_libraries ( server LINK_PUBLIC ${Boost_LIBRARIES} )

解决方法

最后,问题很简单。如果可以的话,对于初学者来说,这是一个容易犯的错误,但对于初学者来说,通过常规的Google搜索来破解它几乎是不可能的。

当我发布cmake .时,它默认为64位版本,但假定使用Visual Studio 2019目标。那是错误的。

等效项应该为cmake -G "Visual Studio 15 2017 Win64" .,但不知道这一点,并且按照错误的教程,我改为发布cmake -G "Visual Studio 15 2017" .。默认情况下为32位版本-尽管默认情况下它从未提及此事实。它可以找到增强的功能,但是所有库文件都是64位的,而对于32位则没有用,因此它只是说“我什么都找不到!”。

感谢@Tsyvarev,他应得到答案的功劳。打开调试并逐字符查看搜索到的库文件确实是正确的选择。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...