Cmake没有findBoost

我正在尝试使用CMake来configuration一个项目,但即使它们在指定的文件夹中,也无法findBoost库。 我指定了Boost_INCLUDE_DIR,Boost_LIBRARYDIR和BOOST_ROOT,但是我仍然得到一个错误,说CMake无法findBoost。 可能是这种错误的原因是什么?

你确定你是正确的吗? 这个想法是CMake自动设置BOOST_INCLUDE_DIR,BOOST_LIBRARYDIR和BOOST_ROOT。 在CMakeLists.txt中做这样的事情:

FIND_PACKAGE(Boost) IF (Boost_FOUND) INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR}) ADD_DEFINITIONS( "-DHAS_BOOST" ) ENDIF() 

如果boost没有安装在默认的位置,并且不能被cmakefind,你可以告诉cmake在哪里寻找提升,如下所示:

 SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost") SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib") 

当然这两行必须在CMakeLists.txt中的FIND_PACKAGE(Boost) 之前

通过阅读FindBoost.cmake文件本身可以获得更多的帮助。 它位于你的“模块”目录中。

一个好的开始是设置(Boost_DEBUG 1) – 这将会吐出大量关于提升的地方,寻找什么的信息,并且可能有助于解释为什么找不到它。

它也可以帮助你弄清楚它是否正确地在你的BOOST_ROOT上。

如果“可用版本”variables中未列出boost的确切版本,则FindBoost.cmake有时也会有问题。 你可以通过阅读FindBoost.cmake来find更多的信息

最后,FindBoost.cmake在过去有一些错误。 你可能会尝试的一件事是从最新版本的cmake中取出一个更新的FindBoost.cmake版本,并将其粘贴到CMakeLists.txt的项目文件夹中 – 然后即使你有一个老版本的boost,它也会使用新版本的FindBoost.cmake在您的项目文件夹中。

祝你好运。

我自己一直在努力解决这个问题。 事实certificate, cmake正在使用Boost的命名约定寻找Boost库文件,其中库名是用于构build它的编译器版本的函数。 我们的Boost库是使用GCC 4.9.1编译的,而且这个编译器版本实际上是在我们的系统上。 然而, GCC 4.4.7也正好安装。 碰巧,cmake的FindBoost.cmake脚本自动检测到GCC 4.4.7安装,而不是GCC 4.9.1 ,因此在文件名中寻找具有“ gcc44 ”的Boost库文件,而不是“ gcc49 ” 。

简单的解决方法是通过在CMakeLists.txt -gcc49设置为“ -gcc49 ”来强制cmake假定GCC 4.9已经存在。 通过这个改变, FindBoost.cmake寻找并find了我的Boost库文件。

我也有类似的问题,发现BOOST_INCLUDE_DIR,BOOST_LIBRARYDIR和BOOST_ROOT envvariables必须保存绝对path。 HTH!

如果您正在构build自己的提升,请不要忘记使用–layout =版本,否则search特定版本的库将会失败

对于cmake版本3.1.0-rc2来提升1.57,指定-D_boost_TEST_VERSIONS = 1.57

cmake版本3.1.0-rc2默认升压<= 1.56.0,如使用-DBoost_DEBUG = ON

cmake -D_boost_TEST_VERSIONS = 1.57 -DBoost_DEBUG = ON -DCMAKE_BUILD_TYPE = Debug -DCMAKE_C_COMPILER = clang -DCMAKE_CXX_COMPILER = clang ++

你也可以通过传递-DBOOST_INCLUDEDIR或-DBOOST_ROOT来指定你希望CMake使用的Boost版本,指向正确的版本提升头的位置

例:

cmake -DBOOST_ROOT=/opt/latestboost

当多个升压版本在同一个系统上时,这也是有用的。

对于任何试图构buildCGAL的人 ,特别是静态链接的Boost,还有一点build议。 定义Boost_USE_STATIC_LIBS是不够的; 它会在Boost_DEBUG输出它的值的时候被覆盖。 这里要做的是检查“高级”checkbox并启用CGAL_Boost_USE_STATIC_LIBS