如何在CMakeLists.txt中添加Boost库?

如何在CMakeLists.txt中添加Boost库?,boost,cmake,Boost,Cmake,我需要将Boost库添加到我的CMakeLists.txt中。如何操作或如何添加?将其放入CMakeLists.txt文件中(如果需要,可将任何选项从关闭更改为打开): 显然,您需要将您想要的库放在我放在这里的地方*boost库*。例如,如果您使用的是文件系统和regex库,您会编写: find_package(Boost 1.45.0 COMPONENTS filesystem regex) 您可以使用搜索可用的boost库。它推迟了对Boost的搜索,这是CMake默认安装的 找到Boos

我需要将Boost库添加到我的CMakeLists.txt中。如何操作或如何添加?

将其放入
CMakeLists.txt
文件中(如果需要,可将任何选项从关闭更改为打开):

显然,您需要将您想要的库放在我放在这里的地方*boost库*。例如,如果您使用的是
文件系统
regex
库,您会编写:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)
您可以使用搜索可用的boost库。它推迟了对Boost的搜索,这是CMake默认安装的

找到Boost后,
find_package()
调用将填充许多变量(请查看参考以了解更多信息)。其中包括
BOOST\u INCLUDE\u DIRS
、BOOST\u库和BOOST\u XXX\u库变量,其中XXX替换为特定的BOOST库。您可以使用这些来指定和

例如,假设您需要boost::program_选项和boost::regex,您可以执行以下操作:

find_package( Boost REQUIRED COMPONENTS program_options regex )
include_directories( ${Boost_INCLUDE_DIRS} )
add_executable( run main.cpp ) # Example application based on main.cpp

# Alternatively you could use ${Boost_LIBRARIES} here.
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} )
一些一般提示:

  • 搜索时,FindBoost检查环境变量$ENV{BOOST_ROOT}。如果需要,可以在调用find_包之前设置此变量
  • 当您有多个boost构建版本(多线程、静态、共享等)时,您可以在调用find_包之前指定所需的配置。通过将以下一些变量设置为上的
    Boost\u USE\u STATIC\u LIBS
    Boost\u USE\u multi threaded
    Boost\u USE\u STATIC\u RUNTIME
  • 在Windows上搜索Boost时,请注意自动链接。请阅读中的“Visual Studio用户注意事项”。
    • 我的建议是禁用自动链接并使用cmake的依赖处理:
      add\u definitions(-DBOOST\u ALL\u NO\u LIB)
    • 在某些情况下,您可能需要明确指定使用动态增强:
      add\u定义(-DBOOST\u ALL\u DYN\u链接)
    • 我同意这些答案和建议。但是,我更喜欢单独指定每个库。这使得大型项目中的依赖性更加清晰。 然而,存在错误输入(区分大小写)变量名的危险。 在这种情况下,没有直接的cmake错误,但稍后会出现一些未定义的引用链接器问题,这可能需要一些时间才能解决。因此,我使用以下cmake函数:

      function(VerifyVarDefined)
        foreach(lib ${ARGV}) 
          if(DEFINED ${lib})
          else(DEFINED ${lib})
            message(SEND_ERROR "Variable ${lib} is not defined")
          endif(DEFINED ${lib})
        endforeach()
      endfunction(VerifyVarDefined)
      
      对于上面提到的示例,如下所示:

      VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARY Boost_REGEX_LIBRARY)
      target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} )
      

      如果我写了“BOOST\u PROGRAM\u OPTIONS\u LIBRARY”,就会有一个由cmake触发的错误,不久之后链接器就会触发。

      将@LainIwakura的答案改编为带有导入目标的现代cmake语法,这将是:

      set(Boost_USE_STATIC_LIBS OFF) 
      set(Boost_USE_MULTITHREADED ON)  
      set(Boost_USE_STATIC_RUNTIME OFF) 
      find_package(Boost 1.45.0 COMPONENTS filesystem regex) 
      
      if(Boost_FOUND)
          add_executable(progname file1.cxx file2.cxx) 
          target_link_libraries(progname Boost::filesystem Boost::regex)
      endif()
      
      请注意,不再需要手动指定include目录,因为它已经通过导入的目标
      Boost::filesystem
      Boost::regex
      处理了

      regex
      filesystem
      可以被您需要的任何boost库所取代。

      这可能对某些人有所帮助。我犯了一个顽皮的错误: 对符号“_ZN5boost6system15system_categoryEv”的未定义引用 //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0:添加符号时出错:命令行中缺少DSO cmakeList.txt有一些问题,不知何故,我没有明确地包含“系统”和“文件系统”库。所以,我在CMakeLists.txt中写了这些行

      这些行是在创建项目的可执行文件之前写的,因为在这个阶段,我们不需要将boost库链接到项目的可执行文件

      set(Boost_USE_STATIC_LIBS OFF) 
      set(Boost_USE_MULTITHREADED ON)  
      set(Boost_USE_STATIC_RUNTIME OFF) 
      set(Boost_NO_SYSTEM_PATHS TRUE) 
      
      if (Boost_NO_SYSTEM_PATHS)
        set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
        set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
        set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
      endif (Boost_NO_SYSTEM_PATHS)
      
      
      find_package(Boost COMPONENTS regex date_time system filesystem thread graph program_options) 
      
      find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
      find_package(Boost COMPONENTS program_options REQUIRED)
      
      if(Boost_FOUND)
          include_directories(${BOOST_INCLUDE_DIRS})
          link_directories(${Boost_LIBRARY_DIRS})
          add_definitions(${Boost_DEFINITIONS})
      
          include_directories(${Boost_INCLUDE_DIRS})  
          target_link_libraries(KeyPointEvaluation ${Boost_LIBRARIES})
          target_link_libraries( KeyPointEvaluation ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY})
      endif()
      
      现在在文件的末尾,我将“KeyPointEvaluation”作为我的项目可执行文件来编写这些行

      set(Boost_USE_STATIC_LIBS OFF) 
      set(Boost_USE_MULTITHREADED ON)  
      set(Boost_USE_STATIC_RUNTIME OFF) 
      set(Boost_NO_SYSTEM_PATHS TRUE) 
      
      if (Boost_NO_SYSTEM_PATHS)
        set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
        set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
        set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
      endif (Boost_NO_SYSTEM_PATHS)
      
      
      find_package(Boost COMPONENTS regex date_time system filesystem thread graph program_options) 
      
      find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
      find_package(Boost COMPONENTS program_options REQUIRED)
      
      if(Boost_FOUND)
          include_directories(${BOOST_INCLUDE_DIRS})
          link_directories(${Boost_LIBRARY_DIRS})
          add_definitions(${Boost_DEFINITIONS})
      
          include_directories(${Boost_INCLUDE_DIRS})  
          target_link_libraries(KeyPointEvaluation ${Boost_LIBRARIES})
          target_link_libraries( KeyPointEvaluation ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY})
      endif()
      
      试着说:


      不要忘记将foo替换为项目名称,将组件替换为项目名称

      关于仍有问题的人的答案的附加信息

    • Cmake的
      FindBoost的最新版本。Cmake
      可能不会持续 Boost的版本。如果需要,添加它
    • 使用-DBoost_DEBUG=0配置标志查看有关问题的信息
    • 有关图书馆,请参阅。如果需要,使用
      Boost_编译器
      Boost_体系结构
      后缀变量

    • 谢谢你的一般提示。他们帮了我很多。非常有用的回答!如果我两年前找到这个,我会节省很多时间。这篇文章写得很好。请注意,您不需要为仅标题库指定组件,例如
      lexical\u cast
      。因此,您只需要使用
      find_package
      include_directories
      命令。在Windows上,它还可以帮助您将该命令添加到cmake文件中:add_DEFINITIONS(-DBOOST_ALL__NO_LIB),否则您可能会遇到BOOST_USE_STATIC_LIBS是否可以设置为On,BOOST_USE_STATIC_RUNTIME是否可以设置为OFF?&反之亦然。
      *此处的boost库*
      是什么意思?如果您不知道要使用的boost的确切版本,您也可以使用
      查找包(boost必需组件系统)
      ,如果您想说链接到所有boost,这看起来会是什么样子?我的意思是不列出boost中的所有库。如果只使用boost的头部分,“boost::boost”就足够了。必须显式指定所有编译的boost库。@oLen在哪里可以找到所有导入的cmake boost::*目标的列表?我如何知道我必须链接到哪个?请参阅官方文档