如何正确地将提升与cmake联系起来

时间:2017-05-18 21:30:32

标签: boost cmake

boost($ ENV {BOOST_ROOT})的根目录是

  

C:\升压\ boost_1_64_0

所有已编译的库(.dll,.lib)都在

  

C:\升压\ boost_1_64_0 \ lib64下-MSVC-14.1

他们同时拥有boost_xxx和libboost_xxx。

我的cmake文件是

set(BOOST_ROOT "$ENV{BOOST_ROOT}") 
set(BOOST_LIBRARYDIR "$ENV{BOOST_ROOT}/lib64-msvc-14.1")

message("${BOOST_ROOT}")
message("${BOOST_LIBRARYDIR}")
message("${Boost_INCLUDE_DIR}")

if(MSVC)
    add_definitions(-DBOOST_ALL_NO_LIB) 
    add_definitions(-DBOOST_ALL_DYN_LINK)
endif()

find_package(Boost 1.64.0 COMPONENTS system filesystem program_options REQUIRED)

输出

  

C:\ Boost \ boost_1_64_0

     

C:\升压\ boost_1_64_0 / lib64下-MSVC-14.1

     

C:/ Boost / boost_1_64_0

     

C:/ Program的CMake错误   Files / CMake / share / cmake-3.8 / Modules / FindBoost.cmake:1842(消息):
  无法找到请求的Boost库。

     

Boost版本:1.64.0

     

Boost包含路径:C:/ Boost / boost_1_64_0

     

无法找到以下Boost库:

      boost_system
      boost_filesystem
      boost_program_options
     

找不到Boost库。您可能需要设置BOOST_LIBRARYDIR   到包含Boost库或BOOST_ROOT的目录   Boost的位置。呼叫堆栈(最近一次呼叫):
  CMakeLists.txt:78(find_package)

     

CMakeLists.txt上的CMake错误:84(消息):未找到提升

有人可以帮忙吗?我已经花了好几个小时,但无法弄清楚为什么这不起作用。

3 个答案:

答案 0 :(得分:0)

首先,你使用什么CMake版本?最近,3.8.1 release中包含了一个回归修复程序 - 它是关于BOOST_ROOT中的反斜杠。

其次,如果您使用官方预建的Windows二进制文件,则不需要指定任何其他内容(' cept可能是BOOST_ROOT) - FindBoost.cmake会尝试找到它们同样。 (不幸的是,我不记得那个版本。)

从不set(BOOST_ROOT...)中执行CMakeLists.txt - 只需将此参数传递给cmake通过-D选项运行。更好的方法如下:

if(NOT DEFINED BOOST_ROOT AND NOT "${ENV{BOOST_ROOT}" STREQUAL "")
    set(BOOST_ROOT "$ENV{BOOST_ROOT}")
endif()

使用导入的目标链接所需的Boost库并修改每个taget的编译/链接器标志。请避免修改" global"编译器/链接器选项 - 即使用相应的target_xxx命令而不是add_definitions&等

答案 1 :(得分:0)

我使用以下脚本通过CMake加载boost(使用Linux和Windows):

set(BoostPath "${DefaultBoostPath}" CACHE PATH "Path to Boost")
message(STATUS "Path to Boost: ${BoostPath}")
set(BOOST_ROOT "${BoostPath}")
set(Boost_USE_MULTITHREAD ON)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_NO_SYSTEM_PATHS ON)
set(Boost_ADDITIONAL_VERSIONS "1.57.0" "1.57" "1.58.0" "1.58" "1.59.0" "1.59" "1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64")
find_package(Boost ${RequiredBoostVersion} REQUIRED COMPONENTS ${RequiredBoostComponents})
mark_as_advanced(FORCE Boost_DIR)
set(BoostVersion "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}")
message(STATUS "Boost version: ${BoostVersion}")
if(CompilerName STREQUAL "gcc")
    set(System_LIBRARIES ${System_LIBRARIES} pthread rt)
endif()

你可以看到我必须添加一些版本的Boost,因为我的CMake版本不知道最新版本。 什么是你的CMake版本?也许这是同样的问题。

答案 2 :(得分:0)

你的标题在哪里?我不认为它找到了包含目录(这是成功所必需的)。

在cmake安装目录中搜索FindBoost.cmake,其中有许多有用的东西可供排除故障。

使用private static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB 可以帮助您确定搜索哪些路径以及搜索库的文件名。您可以使用set(Boost_DEBUG ON)指定包含目录(存储文件夹boost的目录),尽管我刚刚展示的是FindBoost.cmake搜索的地方之一。

另外,您不需要set(Boost_INCLUDEDIRS ${BOOST_ROOT}/inc)。如果你没有设置set(BOOST_ROOT "$ENV{BOOST_ROOT}"),FindBoost.cmake会为你做这件事。

请注意,如果您刚下载了boost,则将归档解压缩到${BOOST_ROOT}并使用${BOOST_ROOT}进行编译,那么您的所有文件都在b2中。这也是他们居住的好地方。如果你手动将文件复制到其他地方,那么FindBoost可能会遇到一些麻烦。