c++ - CMake 为 boost 标头选择了错误的库
问题描述
我在 travis 上使用 CMake 3.8.2 和自定义构建 Boost 1.64。我将BOOST_ROOT
CMake 变量设置为我安装 boost 的前缀。但是,尽管它找到了我的标头,但它仍然不断选择错误的库(系统安装的库)。
我试图调试所有可能的东西,但找不到原因。任何想法为什么 CMake 选择错误的库?
从https://travis-ci.com/Return-To-The-Roots/s25client/builds/96509387:
ls -la "${BOOST_DIR}/lib"
total 37952 drwxr-xr-x 17 travis staff 578 Jan 5 16:20 . drwxr-xr-x 4 travis staff 136 Jan 5 16:18 ..
-rw-r--r-- 1 travis staff 259576 Jan 7 18:20 libboost_chrono.a
-rwxr-xr-x 1 travis staff 18656 Jan 7 18:20 libboost_chrono.dylib
-rwxr-xr-x 1 travis staff 132152 Jan 7 18:19 libboost_filesystem.dylib
-rwxr-xr-x 1 travis staff 151976 Jan 7 18:19 libboost_iostreams.dylib
-rwxr-xr-x 1 travis staff 768636 Jan 7 18:19 libboost_locale.dylib
-rwxr-xr-x 1 travis staff 82192 Jan 7 18:20 libboost_prg_exec_monitor.dylib
-rwxr-xr-x 1 travis staff 572724 Jan 7 18:19 libboost_program_options.dylib
-rwxr-xr-x 1 travis staff 1243824 Jan 7 18:20 libboost_regex.dylib
-rw-r--r-- 1 travis staff 103008 Jan 7 18:20 libboost_system.a
-rwxr-xr-x 1 travis staff 24932 Jan 7 18:18 libboost_system.dylib
-rw-r--r-- 1 travis staff 14620656 Jan 7 18:21 libboost_test_exec_monitor.a
-rwxr-xr-x 1 travis staff 160108 Jan 7 18:20 libboost_thread.dylib
-rw-r--r-- 1 travis staff 285880 Jan 7 18:20 libboost_timer.a
-rwxr-xr-x 1 travis staff 48080 Jan 7 18:20 libboost_timer.dylib
-rwxr-xr-x 1 travis staff 925444 Jan 7 18:20 libboost_unit_test_framework.dylib
-- [ /Users/travis/build/Return-To-The-Roots/s25client/deps/cmakeosx/share/cmake-3.8/Modules/FindBoost.cmake:1171 ] _boost_INCLUDE_SEARCH_DIRS = /Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/include;/Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0;PATHS;C:/boost/include;C:/boost;/sw/local/include
-- [ /Users/travis/build/Return-To-The-Roots/s25client/deps/cmakeosx/share/cmake-3.8/Modules/FindBoost.cmake:1421 ] _boost_LIBRARY_SEARCH_DIRS_RELEASE = /Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/lib;/Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/stage/lib;/Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/include/lib;/Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/include/../lib;/Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/include/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib_boost_LIBRARY_SEARCH_DIRS_DEBUG
= /Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/lib;/Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/stage/lib;/Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/include/lib;/Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/include/../lib;/Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/include/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib
-- [ /Users/travis/build/Return-To-The-Roots/s25client/deps/cmakeosx/share/cmake-3.8/Modules/FindBoost.cmake:1567 ] Searching for FILESYSTEM_LIBRARY_RELEASE: boost_filesystem-mt-1_64;boost_filesystem-mt;boost_filesystem
-- [ /Users/travis/build/Return-To-The-Roots/s25client/deps/cmakeosx/share/cmake-3.8/Modules/FindBoost.cmake:365 ] Boost_LIBRARY_DIR_RELEASE = /usr/local/lib
_boost_LIBRARY_SEARCH_DIRS_RELEASE = /usr/local/lib;NO_DEFAULT_PATH;NO_CMAKE_FIND_ROOT_PATH
Boost_FILESYSTEM_LIBRARY_DEBUG:FILEPATH=/usr/local/lib/libboost_filesystem-mt.a
调查 CMake 3.8.2 的 FindBoost 导致find_library
最终被称为:
find_library(result_var
NAMES boost_filesystem-mt-1_64;boost_filesystem-mt;boost_filesystem
HINTS /Users/travis/build/Return-To-The-Roots/s25client/deps/boost1.64.0/lib;<more paths>
NAMES_PER_DIR
DOC "${_boost_docstring_release}"
)
如果找到/usr/local/lib/libboost_filesystem-mt.a
它,它必须找到我的自定义库,该库位于第一个 HINTS 选项中,并且指定了 NAMES_PER_DIR。我仔细检查了 CMAKE_PREFIX_PATH、CMAKE_LIBRARY_PATH 和 CMAKE_FRAMEWORK_PATH,都是空的。
那么这里发生了什么?
澄清与例如我如何让 CMake 找到我的替代 Boost 安装的区别?:
- 我在用着
cmake .... -DBOOST_ROOT=$BOOST_DIR
- 它确实找到了标题并且没有使用例如 Boost.CMake 模块
- 它在提示中首先具有“我的”路径,
find_library
并且NAMES_PER_DIR
应该意味着它首先找到我的库,但它没有。
解决方案
推荐阅读
- python - 如何使用 Selenium 和 Python 相对于 xpath 中的变量定位元素
- amazon-web-services - AWS 如何将更改通知 API 用户?
- swiftui - 从图像 swiftUI 中获取 RGB 强度
- javascript - GrapeCity ActiveReportsJS 如何为数据源传递授权标头
- javascript - Angular 9:[innerHTML] 即使是纯字符串也无法在不清理值的情况下工作
- flutter - Flutter:从 http 请求准备列表数据
- html - 如果我在使用 django 框架时我的 css 不工作,我该怎么办?
- python - Selenium Python 无法使用代理连接到网站
- javascript - 将包中的代码拆分单独导出到不同的包
- javascript - 在 FileReader 之前运行功能出现问题