我使用 CMake* (3.4.1)根据 Boost 库构建一个C ++项目。宿主平台是 Linux ,目标是宿主和 交叉构建 Android NDK。 *
我只使用Boost头文件,而我只是下载/提取了boost文件夹(并且我没有/usr/include/boost目录)。
/usr/include/boost
在我的CMakeLists.txt文件中,我这样声明对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,BOOSTROOT并且BOOST_INCLUDEDIR都具有相同的效果。另外,在尝试任何新操作之前,我已经删除了构建目录中的 所有 内容。
Boost_DIR
BOOSTROOT
BOOST_INCLUDEDIR
此行为 可能 是什么原因?我已经尝试过像这样BOOST_ROOT直接在FindBoost.cmake脚本中打印:
BOOST_ROOT
FindBoost.cmake
message("BOOST_ROOT: $ENV{BOOST_ROOT}")
具有预期的行为(写作BOOST_ROOT: /path/to/boost)。
BOOST_ROOT: /path/to/boost
当然,我现在可以作弊,只需将boost文件夹链接到include交叉编译器的文件夹中,但这当然不好,我想了解发生了什么。
boost
include
交叉编译时,工具链文件通常会设置变量CMAKE_FIND_ROOT_PATH。结合将CMAKE_FIND_ROOT_PATH_MODE_LIBRARY变量设置为ONLY,该CMAKE_FIND_ROOT_PATH变量将用作有效的 chroot 进行find_library调用,因此仅 搜索给定前缀下的 库。
ONLY
CMAKE_FIND_ROOT_PATH
find_library
存在用于调整行为find_path(用于搜索包含路径)和的类似变量find_program。
find_path
find_program
您使用的工具链文件实际上CMAKE_FIND_ROOT_PATH位于第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)。
CMAKE_FIND_ROOT_PATH_MODE_*
请注意,Boost应该为目标平台(如果您使用的是Android NDK)而不是交叉编译的平台(Linux)而构建。