如何正确链接boost和cmake

7vux5j2d  于 2023-08-05  发布在  其他
关注(0)|答案(4)|浏览(193)

boost的根目录($ENV{BOOST_ROOT})是
C:\Boost\boost_1_64_0
所有已编译的库(.dll,.lib)都在
C:\Boost\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\boost_1_64_0/lib64-msvc-14.1
C:/Boost/boost_1_64_0
CMake Error at C:/Program Files/CMake/share/cmake-3.8/Modules/FindBoost.cmake:1842(message):
找不到请求的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)
CMake Error at CMakeLists.txt:84(message):未找到升压
有人能帮帮忙吗?我花了几个小时在这上面,但不知道为什么它不起作用。

6l7fqoea

6l7fqoea1#

首先,您使用的是哪个CMake版本?最近,3.8.1 release中包含了一个回归修复--它是关于BOOST_ROOT中的反斜杠的。
其次,如果您使用的是官方预构建的Windows二进制文件,则不需要指定任何其他内容(BOOST_ROOT除外)-FindBoost.cmake也会尝试查找它们。(我不记得是什么版本了)。

永远不要在你的CMakeLists.txt中做set(BOOST_ROOT...)--只要通过-D选项将此参数传递给cmake run即可。更好的方法如下:

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

字符串
使用导入的目标链接所需的Boost库,并修改每个目标的编译/链接器标志。请避免修改“全局”编译器/链接器选项--即使用相应的target_xxx命令,而不是add_definitions等。

oipij1gg

oipij1gg2#

我使用下面的脚本使用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版本是什么?也许是同一个问题。

kb5ga3dv

kb5ga3dv3#

你的头呢?我认为它没有找到include目录(这是成功的必要条件)。
在你的cmake安装目录中搜索FindBoost.cmake,里面有很多有用的东西可以帮助你排除故障。
使用set(Boost_DEBUG ON)可以帮助您确定搜索哪些路径以及搜索哪些库的文件名。您可以使用set(Boost_INCLUDEDIRS ${BOOST_ROOT}/inc)指定include目录(存储文件夹boost的目录),尽管我刚才展示的是FindBoost.cmake搜索的地方之一。
你不需要set(BOOST_ROOT "$ENV{BOOST_ROOT}")。如果你没有设置${BOOST_ROOT},FindBoost.cmake会为你做这个。
请注意,如果您刚刚下载了boost,将归档文件解压缩到${BOOST_ROOT}并使用b2编译,那么您的所有文件都在${BOOST_ROOT}/stage中。这也是他们居住的好地方。如果您手动复制文件到其他地方,那么FindBoost可能会遇到一些麻烦。

j0pj023g

j0pj023g4#

CMake中包含boost的最基本方法是:

CMakeLists.txt

cmake_minimum_required(VERSION 2.9 FATAL_ERROR)
find_package(Boost REQUIRED)
add_executable(executable-name main.cpp)
target_link_libraries(executable-name ${Boost_LIBRARIES})

字符串

相关问题