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 在自定义位置或库存位置找不到提升的主要内容,如果未能解决你的问题,请参考以下文章

CMake 找不到源文件,即使它位于正确的位置 [关闭]

CMake:找不到提升

CMake 找不到提升。

在本机反应中找不到 sdk 位置

找不到libopencv_core.so.3.4.0的位置,即使程序安装完美且工作正常

maven target 怎么运行 找不到或无法加载主类