CMake在某些情况下不能findBoost的可能原因?

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

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

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

 find_package(Boost 1.57 REQUIRED) 

我configuration我的构build像这样:

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

其实际上按照我的本地构build的预期工作。

当我现在configuration一个完全相同的构build(只指定一些更多的环境variables和一个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目标构build了几乎相同的东西,但是findBoost for host-build的方法在这里不起作用。

我试图设置Boost_DIRBOOSTROOTBOOST_INCLUDEDIR都具有相同的效果。 此外,我已经删除了build立目录中的所有内容,然后尝试新的东西。

什么可能是这种行为的原因? 我已经尝试直接在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变量设置为ONLYCMAKE_FIND_ROOT_PATH变量被用作find_library调用的有效chroot ,因此只有给定前缀(es)下的库才被搜索到

模拟变量存在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)。