CMake 找不到 Boost_LIBRARIES 变量

Posted

技术标签:

【中文标题】CMake 找不到 Boost_LIBRARIES 变量【英文标题】:CMake can't find Boost_LIBRARIES variable 【发布时间】:2020-06-01 18:12:03 【问题描述】:

最终编辑:已解决。 伙计们,问题是由于“WinSock32”而发生的。 我已经添加了

target_link_libraries(modernC__ -lws2_32)

代码已经生成。

我已经在 Ubuntu 中使用 CLion 上的 Boost 库大约 1 年了。但本周我也决定将它安装在 Windows 操作系统上。 所以我在 GitHub 上下载了 Boost 库,并首先使用 Find.Boost 安装了 Boost 库,然后是“Find.Boost”。

在 CLion 的 CMake 设置部分编写了必要的命令后,我注意到变量 $ Boost_LIBRARIES 为空。

当我不使用message()函数时,项目的“CMake”部分没有报错,但是在“build”之后得到错误“undefined reference”。以下是我在 CLion 上编写的 CMake 命令以及收到的错误。

cmake_minimum_required(VERSION 3.16)
project(modernC__)

set(CMAKE_CXX_STANDARD 17)
find_package(Boost 1.66.0)

message($Boost_INCLUDE_DIR)
message($Boost_FOUND)
message($Boost_LIBRARY_DIRS)

IF (Boost_FOUND)
    include_directories($Boost_INCLUDE_DIR)
add_executable(modernC__

        main.cpp

        #concurrencyExampleOne.cpp

        #adapterExampleOne.cpp
        )
target_link_libraries(modernC__ $Boost_LIBRARIES)
    message($Boost_LIBRARIES)
endif()

我的输出是:

"C:\Program Files\JetBrains\CLion 2020.1.1\bin\cmake\win\bin\cmake.exe" -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - MinGW Makefiles" C:\Users\Berke\CLionProjects\modernC++
C:/boost/include/boost-1_66
TRUE
C:/boost/lib
CMake Error at CMakeLists.txt:22 (message):
  message called with incorrect number of arguments


-- Configuring incomplete, errors occurred!

在这种情况下,显然 Cmake 当前无法找到应该链接到我的代码的 .lib 文件。 我的问题是;如何将 .lib 文件永久放入此变量中,或者有其他方法吗?

如果我不使用 "message($Boost_LIBRARIES" 那么编译器会给我这个错误;

[ 50%] Linking CXX executable modernC__.exe
CMakeFiles\modernC__.dir/objects.a(main.cpp.obj): In function `ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition':
C:/boost/include/boost-1_66/boost/system/error_code.hpp:676: undefined reference to `boost::system::generic_category()'
C:/boost/include/boost-1_66/boost/system/error_code.hpp:679: undefined reference to `boost::system::generic_category()'
CMakeFiles\modernC__.dir/objects.a(main.cpp.obj): In function `ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei':
C:/boost/include/boost-1_66/boost/system/error_code.hpp:706: undefined reference to `boost::system::generic_category()'
C:/boost/include/boost-1_66/boost/system/error_code.hpp:709: undefined reference to `boost::system::generic_category()'
C:/boost/include/boost-1_66/boost/system/error_code.hpp:721: undefined reference to `boost::system::generic_category()'
CMakeFiles\modernC__.dir/objects.a(main.cpp.obj): In function `ZN5boost4asio5error19get_system_categoryEv':
C:/boost/include/boost-1_66/boost/asio/error.hpp:230: undefined reference to `boost::system::system_category()'
CMakeFiles\modernC__.dir/objects.a(main.cpp.obj): In function `ZN5boost4asio6detail17winsock_init_base7startupERNS2_4dataEhh':
C:/boost/include/boost-1_66/boost/asio/detail/impl/winsock_init.ipp:39: undefined reference to `_imp__WSAStartup@8'
CMakeFiles\modernC__.dir/objects.a(main.cpp.obj): In function `ZN5boost4asio6detail17winsock_init_base7cleanupERNS2_4dataE':
C:/boost/include/boost-1_66/boost/asio/detail/impl/winsock_init.ipp:56: undefined reference to `_imp__WSACleanup@0'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [CMakeFiles\modernC__.dir\build.make:86: modernC__.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:75: CMakeFiles/modernC__.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/modernC__.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:117: modernC__] Error 2

【问题讨论】:

应该正确填充Boost_LIBRARIES 变量。但是,看起来您可能没有为 MinGW 构建的库。这些是你建造的吗? 我的电脑安装了mingw-64,必要的部分附加到系统环境变量中。我需要做额外的事情吗? 您需要为 MinGW 编译器构建 Boost。你是如何在你的 Windows 机器上构建 Boost 的?你的目标是哪个编译器? 我已按照以下说明操作:gist.github.com/sim642/29caef3cc8afaa273ce6 你能在你的系统上找到 Boost 库吗?与 MinGW 兼容的库的名称中应包含 mgw(例如 libboost_filesystem-mgw48-d-1_66.dll)。 【参考方案1】:

我认为,您应该明确指定 boost 库(作为组件)。 您应该将库添加到目标。

像这样:

find_package(Boost COMPONENTS filesystem system locale context REQUIRED)

...

target_link_libraries($PROJECT_NAME
  ...
  $Boost_FILESYSTEM_LIBRARY
  $Boost_SYSTEM_LIBRARY
  $Boost_LOCALE_LIBRARY
  $Boost_CONTEXT_LIBRARY
  ...
  )





【讨论】:

不幸的是,它不起作用。所以我认为我应该再次建立图书馆。这次我也许可以使用 CMake Gui。当我使用 CMake Gui 时我应该安装 Boost.Find 你知道吗?

以上是关于CMake 找不到 Boost_LIBRARIES 变量的主要内容,如果未能解决你的问题,请参考以下文章

QtCreator 找不到 cmake

CMake 找不到 GLEW

CMake 找不到诅咒

CMake 找不到 Ninja

如果更改了 CMAKE_RUNTIME_OUTPUT_DIRECTORY,CMake 找不到测试

cmake找不到静态库