CMAKE找不到Boost系统和线程

i34xakig  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(86)

由于我的Boost安装在D:\boost_1_83_0上,并由路径变量(用户路径变量)中的BOOST_ROOT指定,因此我的mingw 64 C++编译器找不到部分安装。
这让我很困惑,因为我事先使用了io_context和库的其他元素,它工作了,但是当我使用线程时,我收到了链接器错误。
D:/boost_1_83_0/boost/thread/detail/thread.hpp:182:未定义对boost::thread::start_thread_noexcept()'的引用 D:/boost_1_83_0/boost/thread/detail/thread.hpp:257:未定义对boost::thread::detach()'的引用

我试图显式地链接线程和系统库,事先确认我的安装没有丢失它们。我在我的CMAKE文件中这样做了:

cmake_minimum_required(VERSION 3.26)
project(Boost_Asio_Tutorial)

set(CMAKE_CXX_STANDARD 17)

add_executable(Boost_Asio_Tutorial main.cpp)

find_package(Boost 1.83.0 REQUIRED COMPONENTS thread system)

add_link_options(
        "-municode"

        "-lboost_thread-mgw12-mt-1_83"
        "-lboost_thread"
        "-lboost_system"
        "-lpthread"

)

target_include_directories(${PROJECT_NAME}
        PUBLIC
        $<INSTALL_INTERFACE:include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        ${Boost_INCLUDE_DIRS}
        PRIVATE
)

target_link_libraries(${PROJECT_NAME}
        PRIVATE
        ${Boost_LIBRARIES}
        PUBLIC
)

if(MINGW)
    target_link_libraries(${PROJECT_NAME}
            PUBLIC
            ws2_32
            wsock32
    )
endif()

字符串
这将产生以下错误:
CMake Error at C:/Program Files/JetBrains/CLion 2023.2.1/bin/cmake/win/x64/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:230(message):Could NOT find Boost(缺少:线程系统)(找到合适的版本“1.83.0”,最低要求是“1.83.0”)调用堆栈(最新调用优先):C:/Program Files/JetBrains/CLion 2023.2.1/bin/cmake/win/x64/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:600(_FPHSA_FAILURE_MESSAGE)C:/Program Files/JetBrains/CLion 2023.2.1/bin/cmake/win/x64/share/cmake-3.26/Modules/FindBoost.cmake:2377(find_package_handle_standard_args)CMakeLists.txt:8(find_package)
我错过了什么?
我的cpp文件看起来像这样:

#include <boost/bind/bind.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread.hpp>
#include <boost/bind.hpp>

int main() {
    io::io_context ioContext;
    syncedPrinter sp(ioContext);
    boost::thread t(boost::bind(&boost::asio::io_context::run, &ioContext));
    ioContext.run();
    t.join();

    return 0;
}

eit6fx6z

eit6fx6z1#

虽然boost中的许多库都是头文件,但只有其中一些库(如boost_thread)需要编译为静态或动态库(取决于您的选择)。您需要为编译器MinGW安装boost二进制文件。boost.org下载包含构建boost所需的源代码和头文件以及脚本。
如何构建boost的官方文档在这里:https://www.boost.org/doc/libs/1_83_0/more/getting_started/windows.html#prepare-to-use-a-boost-library-binary
构建可以像打开MinGW终端一样简单,启用编译器设置,并在将目录更改为boost根文件夹后键入:

bootstrap
.\b2

字符串
这个问题应该有助于构建boost:How to build Boost 1.64 in 64 bits?的过程

相关问题