【问题标题】:Possible causes for Boost not being found by CMake in certain situations?在某些情况下,CMake 未找到 Boost 的可能原因是什么?
【发布时间】:2016-03-04 08:26:59
【问题描述】:

我使用 CMake (3.4.1) 根据 Boost 库构建了一个 C++ 项目。主机平台是 Linux,目标是该主机和 cross-build Android NDK。

我只使用了 Boost 头文件,而且我刚刚下载/提取了 boost 文件夹(而且我没有 /usr/include/boost 目录)。

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

find_package(Boost 1.57 REQUIRED)

我这样配置我的构建:

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

对于我的 native 构建,这实际上工作

当我现在以完全相同的方式配置构建时(仅指定更多环境变量和 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 文件夹中,但这当然不好,我想知道发生了什么。

【问题讨论】:

  • 请提供工具链文件的内容。有几个工具链设置会影响find_libraryfind_path CMake 命令,这些命令通常用于Find*.cmake 脚本。
  • 我从 Qt Android CMake 项目中获取工具链文件:github.com/LaurentGomila/qt-android-cmake.git

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


【解决方案1】:

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

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

您使用的工具链文件实际上将CMAKE_FIND_ROOT_PATH 设置为line 1521

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)。

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

【讨论】:

  • 所以这意味着除了将 boost 包含文件夹和(如果需要)所有库复制到 NDK 文件夹之一之外别无他法。
  • 是的,这是交叉编译项目的常用方法 - 将所有需要的库安装在 chroot 目录下。
  • 这意味着除了复制没有其他机会 - 好吧,你可以使用ln -s
猜你喜欢
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 2022-01-19
  • 2015-07-25
  • 2012-08-17
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多