我怎样才能获得cmake来find我的替代升压安装?

我已经在/ usr / local(包含在/ usr / local / include / boost和库在/ usr / local / lib / boost中)中安装了最新版本的boost,现在我试图从源代码安装Wt cmake(版本2.6)似乎无法find升压安装。 它试图提供有关设置BOOST_DIR和Boost_LIBRARYDIR的有用build议,但是我无法通过调整这些variables来使其工作。

我得到的最新的错误消息是它找不到库,但似乎表明它正在使用“/ usr / local / include”作为包含path,这是不正确的(我可以'似乎修复它)。 有没有人有办法解决这个问题呢?还是我需要在cmake里面找出解决办法?

你应该看看FindBoost.cmake脚本,它处理Boost检测和设置所有的Boostvariables。 它通常驻留在/usr/share/cmake-2.6/Modules/ 。 在这里面,你会发现文档。 例如:

 # These last three variables are available also as environment variables: # # BOOST_ROOT or BOOSTROOT The preferred installation prefix for searching for # Boost. Set this if the module has problems finding # the proper Boost installation. # 

与BOOST_ROOT相反,您所指的variables实际上是由FindBoost模块设置的variables。 请注意,您不必(也可能不想)编辑您的CMake项目configuration来设置BOOST_ROOT。 相反,你应该使用环境variables,例如调用

# BOOST_ROOT=/usr/local/... ccmake .

我终于能够得到我想要的东西

 cmake -DCMAKE_INSTALL_PREFIX=$TARGET \ -DBoost_NO_BOOST_CMAKE=TRUE \ -DBoost_NO_SYSTEM_PATHS=TRUE \ -DBOOST_ROOT:PATHNAME=$TARGET \ -DBoost_LIBRARY_DIRS:FILEPATH=${TARGET}/lib 

我有一个类似的问题, cmake发现供应商安装提升,但我的集群有一个本地安装的版本,这是想要它使用。 RHEL 6

无论如何,看起来像所有的BOOSTROOTBOOST_ROOTBoost_DIR东西会得到恼火,除非一个也设置Boost_NO_BOOST_CMAKE (例如添加到cmd行-DBoost_NO_BOOST_CMAKE=TRUE )。

(我会承认CMake对于多平台的有用性,但我仍然可以讨厌它)。

一般来说,最常见的错误是在添加新的选项后不清洁您的BUILD DIR。 我从系统数据包pipe理器安装了Boost。 它的版本是1.49。 我还下载了Boost 1.53,并将其安装在$HOME/installs

在我的项目中唯一需要做的是:(我将源保存在my_project_directory/src

 cd my_project_directory mkdir build cd build cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src 

就是这样。 Ta bum tss。

但是如果我在cd build之后cd build – > cmake ../src它会从系统path设置Boost。 然后执行cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src将不会改变任何内容。

你必须清理你的build筑目录。 ( cd build && rm -rf * ;))

有一个通用的方法给cmake方向关于在哪里可以find库。

在查找lib时,cmake首先查找下列variables:

  • CMAKE_LIBRARY_PATHLD_LIBRARY_PATH用于库
  • 包括CMAKE_INCLUDE_PATHINCLUDE_PATH

如果你在一个env vars中声明你的boost文件,cmake会find它。 例如:

 export CMAKE_LIBRARY_PATH="/stuff/lib.boost.1.52/lib:$CMAKE_LIBRARY_PATH" export CMAKE_INCLUDE_PATH="/stuff/lib.boost.1.52/include:$CMAKE_INCLUDE_PATH" 

如果太麻烦,你也可以使用我写的一个很好的安装工具,它会为你做所有事情: C ++版本pipe理器

我有一个类似的问题,我可以通过添加bewlow行到我的CMakeLists.txt使用自定义的boost库:

 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 REQUIRED regex date_time system filesystem thread graph program_options) include_directories(${BOOST_INCLUDE_DIRS}) 

正式来说, FindBoost页面声明这些variables应该被用来'提示'boost的位置。

该模块从variables读取有关search位置的提示:

 BOOST_ROOT - Preferred installation prefix (or BOOSTROOT) BOOST_INCLUDEDIR - Preferred include directory eg <prefix>/include BOOST_LIBRARYDIR - Preferred library directory eg <prefix>/lib Boost_NO_SYSTEM_PATHS - Set to ON to disable searching in locations not specified by these hint variables. Default is OFF. Boost_ADDITIONAL_VERSIONS - List of Boost versions not known to this module (Boost install locations may contain the version) 

这使得理论上正确的咒语:

 cmake -DBoost_NO_SYSTEM_PATHS=TRUE \ -DBOOST_ROOT=/path/to/boost-dir \ -DBOOST_LIBRARYDIR=/path/to/boost-dir/lib \ -DBOOST_INCLUDEDIR=/path/to/boost-dir/include 

不要使用FindBoost

我真的不喜欢CMake。 可以说,比起之前的版本更好,但是像FindBoost这样的automagic实际上只有在boost被安装在一个众所周知的位置,并且不能很好地处理多个版本或者交叉编译的时候才是魔术。 你可以放弃麻烦的FindBoost脚本,只是直接包含头文件和库,这是可靠的,但是你刚刚减less了使用CMake的价值。

从源代码编译

最后,您可以按照我所做的方式躲避问题,即从源代码下载并编译项目的boost。 这在交叉编译时特别有用。

 include( ExternalProject ) set( boost_URL "http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2" ) set( boost_SHA1 "9f1dd4fa364a3e3156a77dc17aa562ef06404ff6" ) set( boost_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/third_party/boost ) set( boost_INCLUDE_DIR ${boost_INSTALL}/include ) set( boost_LIB_DIR ${boost_INSTALL}/lib ) ExternalProject_Add( boost PREFIX boost URL ${boost_URL} URL_HASH SHA1=${boost_SHA1} BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh --with-libraries=filesystem --with-libraries=system --with-libraries=date_time --prefix=<INSTALL_DIR> BUILD_COMMAND ./b2 install link=static variant=release threading=multi runtime-link=static INSTALL_COMMAND "" INSTALL_DIR ${boost_INSTALL} ) set( Boost_LIBRARIES ${boost_LIB_DIR}/libboost_filesystem.a ${boost_LIB_DIR}/libboost_system.a ${boost_LIB_DIR}/libboost_date_time.a ) message( STATUS "Boost static libs: " ${Boost_LIBRARIES} ) 

然后当你调用这个脚本时,你需要包含boost.cmake脚本(我的是在一个子目录中),包含头文件,指示依赖关系,并链接库。

 include( boost ) include_directories( ${boost_INCLUDE_DIR} ) add_dependencies( MyProject boost ) target_link_libraries( MyProject ${Boost_LIBRARIES} ) 

cmake周围挖掘并试验之后,我确定cmake不满意这一事实,即我所有的boost库都包含在/usr/local/lib/boost而不是/usr/local/lib 。 一旦我把它们软链接出来,构build工作。

我也遇到了同样的问题,尝试提示这里没有帮助,不幸的是。 唯一帮助的是从boost页面下载最新版本,编译和安装,如下所述: http : //piyushparkash.blogspot.de/2012/10/installing-boost-150-in-ubuntu-1210.html

在我的例子中,我使用boost 1.53。

虽然configuration可以find我的提升安装,cmake不能。

findFindBoost.cmake并查找LIBRARY_HINTS以查看它正在查找的子包。 在我的情况下,它需要mpi和graphics库。

  # Compute component-specific hints. set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "") if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR ${COMPONENT} STREQUAL "graph_parallel") foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES}) if(IS_ABSOLUTE "${lib}") get_filename_component(libdir "${lib}" PATH) string(REPLACE "\\" "/" libdir "${libdir}") list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir}) endif() endforeach() endif() 

apt-cache search …我安装了开发包,因为我正在构build代码,而开发包在所有的依赖关系中都是拖动的。 我不太确定一个标准的升压安装需要openmpi,但现在可以。

 sudo apt-get install libboost-mpi-dev libboost-mpi-python-dev sudo apt-get install libboost-graph-parallel-dev 

我的大部分时间都在努力工作。 我尝试了所有的-DBOOST_ *&c。 指令与cmake,但它保持链接到我的系统Boost库,即使重复清理和重新configuration我的生成区域。 最后,我修改了生成的Makefile,并使cmake_check_build_system目标无效(例如'echo'“'),以便在运行make时不会覆盖我的更改,然后执行'grep -rl'lboost_python”* | xargs sed -i“s:-lboost_python:-L / opt / sw / gcc5 / usr / lib / -lboost_python:g'在我的build /目录下,明确指出所有的构build命令都是我想使用的Boost安装。 ,那工作。

我承认这是一个丑陋的混乱,但我只是把它摆在这里,是为了那些在同一个砖墙上出现的人的利益,只是想解决它,并完成工作。