其他分享
首页 > 其他分享> > c-在某些情况下CMake找不到Boost的可能原因?

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

作者:互联网

我使用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_DIR,BOOSTROOT和BOOST_INCLUDEDIR设置为相同的效果.另外,在尝试任何新操作之前,我已经删除了构建目录中的所有内容.

此行为可能是什么原因?我已经尝试过像这样在FindBoost.cmake脚本中直接打印BOOST_ROOT:

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

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

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

解决方法:

交叉编译时,工具链文件通常将变量CMAKE_FIND_ROOT_PATH设置为零.与CMAKE_FIND_ROOT_PATH_MODE_LIBRARY变量设置为ONLY一起,CMAKE_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).

请注意,Boost应该为目标平台(如果您使用的是Android NDK)而不是交叉编译的平台(Linux)而构建.

标签:cmake,boost,cross-platform,linux,c-4
来源: https://codeday.me/bug/20191119/2032379.html