cmake 在自定义位置或库存位置找不到提升
Posted
技术标签:
【中文标题】cmake 在自定义位置或库存位置找不到提升【英文标题】:cmake cannot find boost in a custom location or stock location 【发布时间】:2018-09-08 18:24:59 【问题描述】:这个问题是之前在 SO 上出现过的问题。比如这个问题: Cmake doesn't find Boost 但是那里和其他地方的答案似乎不起作用。
在安装了 stock boost 1.58.0 的 Ubuntu 16.04 上,我还在自定义位置构建了 boost 1.68.0。
现在我正在尝试使用 boost 和 cmake 编译一个简单的 c++ 程序。它没有找到提升。任一版本(尽管 1.68.0 是我真正想要使用的版本)。 它给: -- 找不到 Boost(缺少:Boost_DIR)
CMakeLists.txt 文件如下。正在使用 CMake 3.12.1。
cmake_minimum_required(VERSION 3.0.0)
set(CMAKE_CXX_STANDARD 17)
project(mytest CXX)
set(Boost_DEBUG ON)
set(Boost_DETAILED_FAILURE_MSG ON)
set(BOOST_ROOT /home/hal/projects/boost/boost)
# set(Boost_DIR /home/hal/projects/boost/boost)
#set(Boost_USE_DEBUG_LIBS ON)
#set(Boost_USE_STATIC_LIBS ON)
#set(Boost_USE_MULTITHREADED ON)
# set(Boost_USE_STATIC_RUNTIME OFF)
#set(Boost_INCLUDE_DIR /home/hal/projects/boost/boost )
set(Boost_ADDITIONAL_VERSIONS "1.58" "1.58.0")
#set(BOOST_INCLUDEDIR /home/hal/projects/boost/boost/include )
#set(BOOST_LIBRARYDIR /home/hal/projects/boost/boost/lib )
#SET(CMAKE_INCLUDE_PATH $CMAKE_INCLUDE_PATH "/home/hal/projects/boost/boost")
#SET(CMAKE_LIBRARY_PATH $CMAKE_LIBRARY_PATH "/home/hal/projects/boost/boost/lib")
find_package(Boost 1.68.0 COMPONENTS system date_time PATHS /home/hal/projects/boost/boost )
if(Boost_FOUND)
include_directories($Boost_INCLUDE_DIRS)
add_executable(mytest main.cpp)
target_link_libraries(mytest $Boost_LIBRARIES stdc++)
endif()
【问题讨论】:
使用Boost_DEBUG
选项 CMake 输出搜索 Boost 的位置以及搜索的确切文件。显示该输出。
该输出在文件系统中的什么位置?
再次运行cmake
,消息会输出到控制台。
当我运行时:cmake 。 | tee output.txt -- 找不到 Boost(缺少:Boost_DIR) -- 配置完成 -- 生成完成 -- 构建文件已写入:/home/hal/projects/testcpp/src
哦,我明白了 - 删除 PATHS
选项到 find_package(Boost)
。该选项不符合您的要求,设置BOOST_ROOT
应该就足够了。
【参考方案1】:
除非您使用实现搜索包装,否则find_package
的选项PATHS 没有多大用处,只需删除它:
find_package(Boost 1.68.0 COMPONENTS system date_time)
说明
CMake中搜索包有两种方式:
-
带有
XXXConfig.cmake
脚本,附带特定的软件包安装。在此脚本中,所有路径(库、包含目录等)都是硬编码。
使用 FindXXX.cmake
脚本,随 CMake 本身提供。该脚本搜索系统目录下的库和头文件(如/usr/local/lib
),但也从用户那里获取hints。
默认情况下会尝试第二种方式;仅当FindXXX.cmake
脚本不存在时,才使用第一种方式。
但find_package
的某些选项仅适用于第一种方式,而PATHS 正是这种类型的选项:它指定了可以找到XXXConfig.cmake
文件的路径。有了这样的选项,find_package
使用第二种方式——它试图找到XXXConfig.cmake
脚本并执行它。但是您的 Boost 安装似乎缺少此配置脚本,因此 CMake 无法找到 Boost。
【讨论】:
以上是关于cmake 在自定义位置或库存位置找不到提升的主要内容,如果未能解决你的问题,请参考以下文章