在某些情况下CMake无法找到Boost的可能原因?

时间:2016-03-04 08:26:59

标签: c++ linux boost cmake cross-platform

我使用 CMake (3.4.1)根据 Boost 库构建C ++项目。主机平台 Linux ,目标是主机,交叉构建 Android NDK。

我只使用Boost头文件,我刚刚下载/解压缩了boost文件夹(我没有/usr/include/boost目录。)

在我的CMakeLists.txt文件中,我像这样声明了对Boost的依赖:

find_package(Boost 1.57 REQUIRED)

我按照以下方式配置我的构建:

BOOST_ROOT=/path/to/boost cmake ../src

实际上的工作与我的原生版本一样。

当我现在以完全相同的方式配置构建时(仅指定一些更多的环境变量和一个CMAKE_TOOLCHAIN_FILE)CMake给了我:

BOOST_ROOT=/path/to/boost JAVA_HOME=/bla/bla/bla \
ANDROID_NDK=/bla/bla/bla \
ANDROID_SDK=/bla/bla/bla \
ANT=/usr/bin/ant \
cmake ../src -DCMAKE_TOOLCHAIN_FILE=/bla/bla/android.toolchain.cmake

CMake Error at /usr/share/cmake/Modules/FindBoost.cmake:1247 (message):
  Unable to find the requested Boost libraries.

  Unable to find the Boost header files.  Please set BOOST_ROOT to the root
  directory containing Boost or BOOST_INCLUDEDIR to the directory containing
  Boost's headers.
Call Stack (most recent call first):
  CMakeLists.txt:4 (find_package)

所以我相信我为Android目标构建了几乎相同的东西,但是找到主机构建的Boost的方法在这里不起作用。

我尝试将Boost_DIRBOOSTROOTBOOST_INCLUDEDIR设置为具有相同的效果。在尝试任何新内容之前,我还删除了构建目录中的所有内容。

可能这种行为的原因是什么?我已经尝试直接在BOOST_ROOT脚本中打印FindBoost.cmake,如下所示:

message("BOOST_ROOT: $ENV{BOOST_ROOT}")

具有预期的行为(写BOOST_ROOT: /path/to/boost)。

当然我现在可以作弊,只需将boost文件夹链接到交叉编译器的include文件夹中,但这当然不太好,我想知道发生了什么。

1 个答案:

答案 0 :(得分:3)

交叉编译时,工具链文件通常设置变量CMAKE_FIND_ROOT_PATH。结合设置为ONLY的{​​{3}}变量,CMAKE_FIND_ROOT_PATH变量用作find_library调用的有效 chroot ,因此只有库才能使用搜索前缀

存在适用于find_path(用于搜索包含路径)和find_program的调整行为的模拟变量。

您使用的工具链文件实际上在CMAKE_FIND_ROOT_PATH_MODE_LIBRARY设置了CMAKE_FIND_ROOT_PATH

set( CMAKE_FIND_ROOT_PATH "${ANDROID_TOOLCHAIN_ROOT}/bin"
    "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}"
    "${ANDROID_SYSROOT}"
    "${CMAKE_INSTALL_PREFIX}"
    "${CMAKE_INSTALL_PREFIX}/share" )

及以下将CMAKE_FIND_ROOT_PATH_MODE_*个变量设为ONLY。所以你需要在其中一个目录下安装Boost,并提供相对于它的提示(如BOOST_ROOT)。

请注意,Boost应该针对目标平台(在您的情况下为Android NDK)构建,而不是针对您进行交叉编译的平台(Linux)。