【问题标题】:CMake can't link boost libsCMake 无法链接 boost 库
【发布时间】:2018-05-04 14:47:24
【问题描述】:

CMake 可以找到我安装的 boost 版本 (1.67.0),但每当我尝试链接库时,我都会得到大量“未定义的引用”。

这是我要运行的程序(boost 网站上的示例):

#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main(int, char *[])
{
    std::string line;
    boost::regex pat("^Subject: (Re: |Aw: )*(.*)");

    while(std::cin) {
        std::getline(std::cin, line);
        boost::smatch matches;
        if(boost::regex_match(line, matches, pat)) {
            std::cout << matches[2] << '\n';
        }
    }

    return 0;
}

这是我的 CMake 脚本:

cmake_minimum_required( VERSION 3.5 )

project( REGEX )

set( BOOST_ROOT D:/Dev/boost/boost_1_67_0/boost_1_67_0 )
set( Boost_LIBRARY_DIR D:/Dev/boost/boost_1_67_0/boost_1_67_0/stage/lib )
set( Boost_USE_STATIC_LIBS ON )
set( Boost_USE_MULTITHREADED ON )

find_package( Boost REQUIRED )

include_directories( ${Boost_INCLUDE_DIRS} )

add_executable( regex ${PROJECT_SOURCE_DIR}/main.cxx )

target_link_libraries( regex ${Boost_LIBRARIES} )

我需要做什么才能成功地将 boost 库与 cmake 链接?

编辑: 我已经更改了脚本,所以现在它看起来像这样:

cmake_minimum_required( VERSION 3.5 )

project( REGEX )

set( BOOST_ROOT D:/Dev/boost/boost_1_67_0/boost_1_67_0 )
set( BOOST_INCLUDEDIR D:/Dev/boost/boost_1_67_0/boost_1_67_0/boost )
set( BOOST_LIBRARYDIR D:/Dev/boost/boost_1_67_0/boost_1_67_0/stage/lib )
set( Boost_USE_STATIC_LIBS ON )
set( Boost_USE_MULTITHREADED ON )
set( Boost_DEBUG ON )

find_package( Boost COMPONENTS regex REQUIRED )

include_directories( ${Boost_INCLUDE_DIRS} )

add_executable( regex ${PROJECT_SOURCE_DIR}/main.cxx )

target_link_libraries( regex ${Boost_LIBRARIES} )

启用 boost 调试后,我看到 cmake 没有任何目录可以搜索库,所以我尝试手动设置它。我刚刚安装了 3.11.1 版本的 CMake,但它仍然无法识别正则表达式库。

【问题讨论】:

  • 您使用的是哪个 CMake 版本?看看这个 answer 到另一个线程是否有帮助。 3.11 之前的 CMake 无法处理 boost 1.66 中引入的新命名方案。
  • 非常感谢您的建议,我会安装最新版本的cmake看看是否有效
  • 为了使CMake 3.11.03.11.1 工作,您可能还需要在find_package 调用Boost 之前将set(Boost_ADDITIONAL_VERSIONS "1.67.0") 添加到CMakeLists.txt,因为Boost 1.67.0 不包含在_Boost_KNOWN_VERSIONS 附带的 FindBoost.cmake 文件的变量。
  • 我刚刚这样做了,但它仍然给我同样的错误:“找不到以下静态 Boost 库:boost_regex”
  • 您在进行这些更改后是否清除(删除)了 CMakeCache.txt?不这样做是一个常见的问题。你知道你可以从这个link 下载许多平台的预构建二进制文件吗? Boost 家伙提供了这些二进制文件。只是为了确保自己构建 Boost 的问题不是真正的问题。

标签: c++ windows boost cmake


【解决方案1】:

显然,Boost_LIBRARIES 是空的。 您应该在 find_package(Boost REQUIRED [COMPONENTS components]) 中明确指定要链接的 boost 组件,以便它们出现在 Boost_LIBRARIES 中。

在你的情况下应该是find_package(Boost REQUIRED COMPONENTS regex)

参见 cmake-boost 文档:https://cmake.org/cmake/help/v3.8/module/FindBoost.html

【讨论】:

  • 如果我把 find_package(Boost COMPONENTS regex REQUIRED) 它说它找不到 boost_regex
  • 不能肯定,但也许 boost_regex 需要额外的安装步骤(构建等)?
  • 我假设只要在构建所有 boost 库之后立即给出示例,它就不需要其他任何东西,但我不知道......
【解决方案2】:

1.安装 CMake

cd ~
wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5.tar.gz
tar xf cmake-3.14.5.tar.gz
cd cmake-3.14.5
./bootstrap --parallel=10
make -j4
sudo make -j4 install

2。安装 Boost

cd ~
wget https://boostorg.jfrog.io/artifactory/main/release/1.69.0/source/boost_1_69_0.tar.gz
tar xf boost_1_69_0.tar.gz
cd boost_1_69_0
./bootstrap.sh
./b2 ... cxxflags="-std=c++0x -stdlib=libc++" linkflags="-stdlib=libc++" ...
sudo ./b2 toolset=gcc -j4 install

3。 CMakeLists.txt

# Defines AppBase library target.
project(recipe_01)
cmake_minimum_required(VERSION 3.5)

include(GNUInstallDirs)

set(CMAKE_EXPORT_COMPILE_COMMANDS "ON")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

if(CMAKE_CXX_STANDARD EQUAL 98 OR CMAKE_CXX_STANDARD LESS 14)
   message(FATAL_ERROR "app requires c++14 or newer")
elseif(NOT CMAKE_CXX_STANDARD)
   set(CMAKE_CXX_STANDARD 14)
   set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()

find_package(Boost 1.60 REQUIRED COMPONENTS regex)

add_executable(main main.cpp)

target_link_libraries(main Boost::regex)

如何构建

mkdir build
cd build
cmake ..
cmake --build .

如何运行

./bin/main

【讨论】: