fra*_*ans 6 c++ linux boost cross-platform cmake
我使用CMake (3.4.1)根据Boost库构建了一个 C++ 项目。宿主平台为Linux,目标为宿主和交叉构建的Android NDK。
我只使用 Boost 头文件,我刚刚下载/提取了 boost 文件夹(我没有/usr/include/boost
目录)。
在我的CMakeLists.txt
文件中,我像这样声明了对 Boost 的依赖:
find_package(Boost 1.57 REQUIRED)
Run Code Online (Sandbox Code Playgroud)
我像这样配置我的构建:
BOOST_ROOT=/path/to/boost cmake ../src
Run Code Online (Sandbox Code Playgroud)
这实际上工程预期为我的本地版本。
当我现在以完全相同的方式配置构建时(仅指定更多环境变量和 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)
Run Code Online (Sandbox Code Playgroud)
所以我相信我为 Android 目标做了几乎相同的构建,但是为主机构建找到 Boost 的完全相同的方法在这里不起作用。
我试图设置Boost_DIR
,BOOSTROOT
并且BOOST_INCLUDEDIR
都具有相同的效果。在尝试任何新内容之前,我还删除了构建目录中的所有内容。
有什么可以可能对这种行为的原因?我已经尝试过像这样BOOST_ROOT
直接在FindBoost.cmake
脚本中打印:
message("BOOST_ROOT: $ENV{BOOST_ROOT}")
Run Code Online (Sandbox Code Playgroud)
与预期的行为(写作BOOST_ROOT: /path/to/boost
)。
当然,我现在可以作弊,将boost
文件夹链接到include
交叉编译器的文件夹中,但这当然不好,我想知道发生了什么。
交叉编译时,工具链文件通常会设置变量CMAKE_FIND_ROOT_PATH。结合CMAKE_FIND_ROOT_PATH_MODE_LIBRARY变量设置为ONLY
,CMAKE_FIND_ROOT_PATH
变量被用作有效的chroot为find_library
调用,因此只库给定前缀(ES)下被搜索。
存在模拟变量以调整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" )
Run Code Online (Sandbox Code Playgroud)
下面将CMAKE_FIND_ROOT_PATH_MODE_*
变量设置为ONLY
. 所以你需要在这些目录之一下安装 Boost,并给出相关的提示(如 BOOST_ROOT)。
请注意,Boost 应该为目标平台(在您的情况下为 Android NDK)构建,而不是为您交叉编译的平台(Linux)构建。
归档时间: |
|
查看次数: |
816 次 |
最近记录: |