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 变量的主要内容,如果未能解决你的问题,请参考以下文章