我需要将Boost库添加到我的CMakeLists.txt中。你是怎么做的或者你如何添加它?
答案 0 :(得分:152)
将其放入CMakeLists.txt
文件中(如果需要,可将任何选项从OFF更改为ON):
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS *boost libraries here*)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(progname file1.cxx file2.cxx)
target_link_libraries(progname ${Boost_LIBRARIES})
endif()
显然,您需要将所需的库放在我放置*boost libraries here*
的位置。例如,如果您使用的是filesystem
和regex
库,则可以编写:
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
答案 1 :(得分:73)
您可以使用find_package搜索可用的boost库。它将搜索Boost推迟到FindBoost.cmake,这是默认使用CMake安装的。
找到Boost后,find_package()
调用将填充许多变量(检查FindBoost.cmake的引用)。其中包括BOOST_INCLUDE_DIRS
,Boost_LIBRARIES和Boost_XXX_LIBRARY变量,其中XXX替换为特定的Boost库。您可以使用这些来指定include_directories和target_link_libraries。
例如,假设您需要boost :: program_options和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} )
一些一般提示:
On
来执行此操作:Boost_USE_STATIC_LIBS
,Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
答案 2 :(得分:19)
使用导入的目标调整@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()
请注意,不再需要手动指定包含目录,因为已经通过导入的目标Boost::filesystem
和Boost::regex
处理了这些目录。
regex
和filesystem
可以替换为您需要的任何增强库。
答案 3 :(得分:5)
这可能对某些人有帮助。我有一个顽皮的错误: 对符号'_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)
现在在文件的末尾,我通过将“KeyPointEvaluation”视为我的项目可执行文件来编写这些行。
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()
答案 4 :(得分:2)
我同意答案1和2。但是,我更喜欢单独指定每个库。这使得大项目中的依赖性更加清晰。 然而,存在错误输入(区分大小写)变量名称的危险。 在这种情况下,没有直接的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_PROGRAM_OPTIONS_LIBRARY”,那么cmake会触发一个错误,后来很少会被链接器触发。
答案 5 :(得分:1)
set(Boost_USE_STATIC_LIBS ON) # only find static libs
set(Boost_USE_DEBUG_LIBS OFF) # ignore debug libs and
set(Boost_USE_RELEASE_LIBS ON) # only find release libs
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(foo foo.cc)
target_link_libraries(foo ${Boost_LIBRARIES})
endif()
别忘了将foo替换为您的项目名称,并将组件替换为您的项目名称!
答案 6 :(得分:0)
为仍然有问题的人提供更多信息。
FindBoost.cmake
的最新版本可能不满意
Boost的版本。如果需要,添加它。Boost_COMPILER
和Boost_ARCHITECTURE
后缀vars。