在某些情况下,CMake 找不到 Boost 的可能原因

Possible causes for Boost not being found by CMake in certain situations?

本文关键字:Boost 找不到 情况下 CMake      更新时间:2023-10-16

我使用 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都具有相同的效果。此外,在尝试任何新内容之前,我已经删除了构建目录中的所有内容。

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

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

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

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

交叉编译时,工具链文件通常会设置变量CMAKE_FIND_ROOT_PATH。结合设置为 ONLY 的 CMAKE_FIND_ROOT_PATH_MODE_LIBRARY 变量,CMAKE_FIND_ROOT_PATH变量用作find_library调用的有效 chroot,因此只搜索给定前缀下的库。

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

您使用的工具链文件实际上在第 1521 行设置了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)。