0

我正在使用实际devel分支中的 Catch2,尝试比较两个时出现链接器错误vector<string_view>

该问题可以重现如下:

#include <vector>
#include <string_view>
#include <catch2/catch_test_macros.hpp>

TEST_CASE("Can split string", "[split]") {
  vector<string_view> splittedString = {"this is a string view"sv};
  vector<string_view> EXPECTED = {"I'm"sv, "Elvis"sv,"Dukaj"sv};
  REQUIRE(splittedString == EXPECTED);
}

我的CMakeLists.txt

find_package(Catch2 REQUIRED)
# ...
target_link_libraries(${PROJECT_NAME} PRIVATE  Catch2::Catch2WithMain)

尝试构建时出现以下链接器错误:

Catch2/src/catch2/../catch2/catch_tostring.hpp:126: error: undefined reference to `Catch::StringMaker<std::basic_string_view<char, std::char_traits<char> >, void>::convert[abi:cxx11](std::basic_string_view<char, std::char_traits<char> >)'

我究竟做错了什么?我错过了一些包括吗?

4

1 回答 1

1

解决方案

您需要使用 C++17 支持构建 Catch 才能在 REQUIRE() 和其他宏中使用 string_view。默认情况下,出于某种原因,Catch 是使用 C++14 构建的。

为此,您可以在包含 Catch 源的目录中运行它:

mkdir build && cd build
cmake -DCMAKE_CXX_STANDARD=17 ..
sudo make install

笔记

  1. 您严重依赖 Catch2 v3 功能,因此您应该使用find_package(Catch2 3 REQUIRED)而不是仅find_package(Catch2 REQUIRED)在您的 cmake 文件中使用
  2. 您可以在此处此处查看有关该问题的讨论
于 2021-12-12T03:44:44.773 回答