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

问题描述:

我建立一个C++项目取决于Boost库使用CMake(3.4.1)。主机平台是Linux,目标是该主机和交叉生成 Android NDK。CMake在某些情况下无法找到Boost的可能原因?

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

在我CMakeLists.txt文件我声明依赖,以提高这样的:

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,BOOSTROOTBOOST_INCLUDEDIR都具有相同的效果。此外,在尝试任何新功能之前,我已经删除了所有内容。

什么可以是可能为什么会有这种行为?我已经尝试过直接在FindBoost.cmake这样的脚本打印BOOST_ROOT

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

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

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

+0

请提供工具链文件的内容。有几个工具链设置影响'find_library'和'find_path' CMake命令,这些命令通常在'Find * .cmake'脚本中使用。 – Tsyvarev

+0

我从Qt Android CMake项目中获取工具链文件:https://github.com/LaurentGomila/qt-android-cmake.git – frans

交叉编译时,工具链文件通常设置变量CMAKE_FIND_ROOT_PATH。与CMAKE_FIND_ROOT_PATH_MODE_LIBRARY变量设置为ONLY组合,CMAKE_FIND_ROOT_PATH变量被用作有效的chroot 呼叫find_library,所以只有库下给定前缀(ES)被搜索

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

工具链文件,您使用实际上是在line 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)。

请注意,应该为目标平台(Android NDK)制作Boost,而不是用于交叉编译的平台(Linux)。

+0

因此,这意味着没有其他机会,只需复制'boost' include文件夹和(if需要)将所有库合并到一个NDK文件夹中。 – frans

+0

是的,这是交叉编译项目的常用方式 - 在chroot目录下安装所有必需的库。 – Tsyvarev