Windows 为什么CMake 3.16寻找boost\u program\u选项<;版本>;而不是libboost_程序选项<;版本>;?

Windows 为什么CMake 3.16寻找boost\u program\u选项<;版本>;而不是libboost_程序选项<;版本>;?,windows,boost,cmake,Windows,Boost,Cmake,我正在Windows上使用CMake 3.16生成一个依赖于boost::program_选项的visual studio 2019解决方案。是指向Github上代码的链接。我已使用以下命令生成: \b2安装--重新配置--前缀=F:\dev\u programs\boost--构建类型=complete 生成的库如下所示(仅限于program_选项输出,因为这是CMake需要的): CMakeLists.txt文件中的find_package命令如下所示: find_程序包(需要Boost

我正在Windows上使用CMake 3.16生成一个依赖于boost::program_选项的visual studio 2019解决方案。是指向Github上代码的链接。我已使用以下命令生成:

\b2安装--重新配置--前缀=F:\dev\u programs\boost--构建类型=complete

生成的库如下所示(仅限于program_选项输出,因为这是CMake需要的):

CMakeLists.txt文件中的find_package命令如下所示:

find_程序包(需要Boost 1.72.0组件程序选项)

如下面的输出所示,当cmake查找程序选项库时,它会查找由boost生成的
libboost\u程序选项-vc142-mt-x64-1\u 72
,而不是
libboost\u程序选项-vc142-mt-x64-1\u 72.lib
。复制已创建的库并删除
lib
前缀可使此操作成功。然而,我觉得我不应该这么做

我还没有找到任何关于为什么会发生这种情况的答案。还有其他人有什么想法吗

[ F:/dev_programs/cmake/share/cmake-3.16/Modules/FindBoost.cmake:2044 ] Searching for PROGRAM_OPTIONS_LIBRARY_RELEASE: boost_program_options-vc142-mt-x64-1_72;boost_program_options-vc142-mt-x64;boost_program_options-vc142-mt;boost_program_options-vc141-mt-x64-1_72;boost_program_options-vc141-mt-x64;boost_program_options-vc141-mt;boost_program_options-vc140-mt-x64-1_72;boost_program_options-vc140-mt-x64;boost_program_options-vc140-mt;boost_program_options-mt-x64-1_72;boost_program_options-mt-x64;boost_program_options-mt;boost_program_options-mt;boost_program_options
[ F:/dev_programs/cmake/share/cmake-3.16/Modules/FindBoost.cmake:649 ] Boost_LIBRARY_DIR_RELEASE = "F:\dev_programs\boost/lib"
[ F:/dev_programs/cmake/share/cmake-3.16/Modules/FindBoost.cmake:651 ] _boost_LIBRARY_SEARCH_DIRS_RELEASE = "F:\dev_programs\boost/lib;NO_DEFAULT_PATH;NO_CMAKE_FIND_ROOT_PATH"
[ F:/dev_programs/cmake/share/cmake-3.16/Modules/FindBoost.cmake:2099 ] Searching for PROGRAM_OPTIONS_LIBRARY_DEBUG: boost_program_options-vc142-mt-gd-x64-1_72;boost_program_options-vc142-mt-gd-x64;boost_program_options-vc142-mt-gd;boost_program_options-vc141-mt-gd-x64-1_72;boost_program_options-vc141-mt-gd-x64;boost_program_options-vc141-mt-gd;boost_program_options-vc140-mt-gd-x64-1_72;boost_program_options-vc140-mt-gd-x64;boost_program_options-vc140-mt-gd;boost_program_options-mt-gd-x64-1_72;boost_program_options-mt-gd-x64;boost_program_options-mt-gd;boost_program_options-mt;boost_program_options
[ F:/dev_programs/cmake/share/cmake-3.16/Modules/FindBoost.cmake:649 ] Boost_LIBRARY_DIR_DEBUG = "F:\dev_programs\boost/lib"
[ F:/dev_programs/cmake/share/cmake-3.16/Modules/FindBoost.cmake:651 ] _boost_LIBRARY_SEARCH_DIRS_DEBUG = "F:\dev_programs\boost/lib;NO_DEFAULT_PATH;NO_CMAKE_FIND_ROOT_PATH"
CMake Error at F:/dev_programs/cmake/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):
  Could NOT find Boost (missing: program_options) (found suitable version
  "1.72.0", minimum required is "1.72.0")
Call Stack (most recent call first):
  F:/dev_programs/cmake/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:393 (_FPHSA_FAILURE_MESSAGE)
  F:/dev_programs/cmake/share/cmake-3.16/Modules/FindBoost.cmake:2165 (find_package_handle_standard_args)
  CMakeLists.txt:23 (find_package)

看起来@Tsyvarev和@squareskittles的评论是正确的


我需要使用
link=shared
runtime link=shared
构建Boost,并将其提供给
b2.exe
。我曾经试过,但现在在一台电脑上用新的boost下载试用后,它神奇地工作了。鉴于此,我将清理我的环境并重试。

您可能需要将
Boost\u USE\u STATIC\u LIBS
设置为
ON
以搜索Boost静态库。静态库具有
lib
后缀。在Windows上,.lib文件用于链接,即使使用DLL。它们(无论如何在C/C++中)用于包含函数的声明,以便编译器知道它们在哪里。这其实不是问题所在。问题是文件名的前缀。libboost_uuz。。。vs boost…Tsyvarev是正确的,您已经构建了boost的静态库(请参阅boost命名约定),您需要要么构建共享库(
link=shared runtime link=shared
),要么将
boost\u USE\u static\u LIBS
设置为
。我将以另一种方式尝试构建boost。我记得构建时,这些选项不产生任何输出。如果有问题,我会用问题的结果更新问题。在我的第一条评论中,我指的是
lib
前缀,而不是后缀。不知道为什么我这样写……你可能会考虑根本不建立提升,并使用维护者提供的二进制文件,并且从安装文件的最新版本中也包含静态LIBS和DLL。这是公平的。然而,看起来他们只为Windows提供二进制文件。我也计划在MacOS上构建我的项目。我认为构建它让我有机会看到另一个代码库并构建系统。我看到的越多,学到的越多