找不到 Boost(缺少:系统)(在“1.78.0”上找到合适的版本,最低要求是“1.78.0”)

mil*_*bos 5 c++ boost build cmake

如何使用cmake运行boost asio?没有这个简单的项目布局:

\n
c1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 c1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.cpp\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n
Run Code Online (Sandbox Code Playgroud)\n

CMakeLists.txt:

\n
cmake_minimum_required(VERSION 3.20.0)\nproject(c1)\n\nadd_executable(c1 c1/main.cpp)\ninclude_directories(.)\n\nset(BOOST_ROOT /usr/local/boost_1_78_0)\nfind_package(Boost 1.78.0 REQUIRED COMPONENTS system)\ntarget_include_directories(c1 PUBLIC ${Boost_INCLUDE_DIR})\ntarget_link_libraries(c1 LINK_PUBLIC ${Boost_LIBRARIES})\n
Run Code Online (Sandbox Code Playgroud)\n

main.cpp

\n
#include <iostream>\n#include <boost/asio.hpp>\n\nint main(){\n    boost::asio::io_context io;\n    boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));\n    t.wait();\n    std::cout << "Hello world!" << std::endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我收到此 cmake 错误:

\n
CMake Error at /usr/local/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):\n  Could NOT find Boost (missing: system) (found suitable version "1.78.0",\n  minimum required is "1.78.0")\nCall Stack (most recent call first):\n  /usr/local/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)\n  /usr/local/share/cmake-3.22/Modules/FindBoost.cmake:2360 (find_package_handle_standard_args)\n  CMakeLists.txt:8 (find_package)\n
Run Code Online (Sandbox Code Playgroud)\n

我不确定我理解是否正确,但它正在尝试找到合适的版本1.78.0,但它找到了1.78.0,那么问题是什么?

\n

在此之前,还有一个警告:

\n
CMake Warning at /usr/local/share/cmake-3.22/Modules/FindBoost.cmake:1369 (message):\n  New Boost version may have incorrect or missing dependencies and imported\n  targets\nCall Stack (most recent call first):\n  /usr/local/share/cmake-3.22/Modules/FindBoost.cmake:1492 (_Boost_COMPONENT_DEPENDENCIES)\n  /usr/local/share/cmake-3.22/Modules/FindBoost.cmake:2102 (_Boost_MISSING_DEPENDENCIES)\n  CMakeLists.txt:8 (find_package)\n
Run Code Online (Sandbox Code Playgroud)\n

所以我该怎么做?

\n

编辑:\n系统库位于:

\n
/usr/local/boost_1_78_0/boost/system\n
Run Code Online (Sandbox Code Playgroud)\n

以及 cmake 在哪里查找的调试输出:

\n
-- [ /usr/local/share/cmake-3.22/Modules/FindBoost.cmake:2053 ] _boost_LIBRARY_SEARCH_DIRS_RELEASE = "/usr/local/boost_1_78_0/lib;/usr/local/boost_1_78_0/stage/lib;/usr/local/boost_1_78_0/lib;/usr/local/boost_1_78_0/../lib;/usr/local/boost_1_78_0/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib"\n-- [ /usr/local/share/cmake-3.22/Modules/FindBoost.cmake:2054 ] _boost_LIBRARY_SEARCH_DIRS_DEBUG = "/usr/local/boost_1_78_0/lib;/usr/local/boost_1_78_0/stage/lib;/usr/local/boost_1_78_0/lib;/usr/local/boost_1_78_0/../lib;/usr/local/boost_1_78_0/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib"\n\n-- [ /usr/local/share/cmake-3.22/Modules/FindBoost.cmake:2239 ] Searching for SYSTEM_LIBRARY_RELEASE: boost_system-gcc10-mt-1_78;boost_system-gcc10-mt;boost_system-gcc10-mt;boost_system-mt-1_78;boost_system-mt;boost_system-mt;boost_system-mt;boost_system\n-- [ /usr/local/share/cmake-3.22/Modules/FindBoost.cmake:2294 ] Searching for SYSTEM_LIBRARY_DEBUG: boost_system-gcc10-mt-d-1_78;boost_system-gcc10-mt-d;boost_system-gcc10-mt-d;boost_system-mt-d-1_78;boost_system-mt-d;boost_system-mt-d;boost_system-mt;boost_system\n
Run Code Online (Sandbox Code Playgroud)\n

但我不明白,为什么 cmake 找不到那个库。

\n

seh*_*ehe 6

看起来您忘记构建 Boost 库。

许多 Boost 库是或可以是仅包含头文件的库,但也有很多不是。

我认为 CMake FindBoost 组件只关心需要构建的库。因此,如果您将其命名system为必需组件,那么您就是在告诉 CMake 您需要链接它,并且它会查找构建的库。

构建的库通常位于stage/lib/例如

/home/sehe/custom/boost/stage/lib/libboost_system.a
/home/sehe/custom/boost/stage/lib/libboost_system.so
/home/sehe/custom/boost/stage/lib/libboost_system.so.1.78.0
Run Code Online (Sandbox Code Playgroud)

但是,如果您没有构建该库,它将丢失。

请参阅https://www.boost.org/doc/libs/1_78_0/more/getting_started/unix-variants.html


56k*_*6ka 5

不要浪费时间尝试编译 Boost,这不是这里的问题。

就像Tsyvarev所说,从1.69版开始,如果您仅使用system或任何其他仅使用标头的组件(不需要构建),则必须删除关键字COMPONENT

find_package(Boost 1.80.0 REQUIRED)

# ...Nothing more
Run Code Online (Sandbox Code Playgroud)