当前位置: 首页 > 面试题库 >

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

葛奇
2023-03-14
问题内容

我使用 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

这实际上 可以 像我的 本机 版本一样工作。

现在,当我以完全相同的方式(仅指定一些其他环境html" target="_blank">变量和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_DIRBOOSTROOT并且BOOST_INCLUDEDIR都具有相同的效果。另外,在尝试任何新操作之前,我已经删除了构建目录中的
所有 内容。

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

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变量将用作有效的
chroot 进行find_library调用,因此仅 搜索给定前缀下的 库。

存在用于调整行为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)。

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



 类似资料:
  • 问题内容: 为什么 工作,但是 不是吗 问题答案: 为了理解这一点,让我们考虑一下编译器在两种可能性下每个步骤所做的事情。让我们开始: 编译器将‘4’转换为int。所以变成 然后编译器变成 ch是一个字符,编译器可以将54转换为字符,因为它可以证明转换没有损失。 现在让我们考虑第二个版本: ch在编译时没有已知值。因此,这成为 现在,编译器无法证明此(int)的结果在char范围内可存储。因此它

  • 我遇到了一个非常奇怪的问题,java线程正忙着等待。 我有一个线程忙于等待其他线程的静态变量的状态。假设忙碌等待的线程正在等待另一个线程的静态int变量达到某个值 如果我使用上面的代码,线程将被卡在忙等待中,不会跳出while循环,即使确实达到5。 但是,如果我使用其他代码,那么线程确实会跳出忙等待循环。有时,一旦达到5,其他时候会晚一点。但它会发生。对于我的特定示例,我将其用作“无意义的工作”

  • 我有一个数据框,其中一列有字符串值,另一列有整数,但这些列有特殊字符,或者字符串数据有整数。因此,为了删除它,我使用了regex,我的regex可以正常工作,但是对于整数列,如果'abc123'是,那么它不会删除abc,如果'123abc'是,那么它不会删除它。我不知道是模式错误还是代码错误。下面是我的代码, 输出: 如您所见,它已在

  • 问题内容: 我已经在带有Selenium和PhantomJS的Python中设置了一个简单的webscraping脚本。我总共要抓取大约200个URL。脚本最初运行良好,然后运行了大约20-30个URL(它可能会更多/更少,因为它失败时似乎是随机的,并且与任何特定的URL不相关),我在python中收到以下错误: 还有我的ghostdriver.log: 我进行了搜索,关于SO的大多数问题似乎都是

  • 我正在尝试上传图片到imgur,我可以上传大部分图片,但有些图片我无法上传,我不知道为什么。这给了我警告。 警告:文件\获取\内容():文件名在C:\wamp64\www\social\my-account.php中不能为空 如果代码有问题,我如何才能上传相同文件类型的其他图像。 从我观察到的所有未能上传的图片来看,文件大小相当大(约2MB至4MB)。 如果这是因为大小,我怎么能解决这个问题。 p

  • 当我运行我的新android项目时,我得到了错误: 因此,正如error所说,复制的本机库不在/verdor/lib或/system/lib中,在我的情况下如何解决这个问题? (我解压缩了apk包,在lib/there libcalculate.so下面) 但是当我运行我的应用程序时,同样的错误抛出: