我对下面的代码有一个链接器问题。它适用于 Visual Studio 2015 编译器,但不适用于 Visual Studio 中的 Clang/LLVM。我尝试了可能不同的变体(下面有一些),一切都很好。它似乎是static constexpr numeric_limits<double>
and的特定组合REQUIRE
。
// quicktest.cpp
#include <limits>
#include <iostream>
#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
#include <catch.hpp>
struct X {
static constexpr double min = std::numeric_limits<double>::min();
static constexpr int min_int = std::numeric_limits<int>::min();
};
SCENARIO("blah")
{
static const double my_min = X::min; // works
std::cout << (5 > X::min) << std::endl; // works
REQUIRE(5 > my_min); // works
REQUIRE(5 > X::min_int); // works (int)
REQUIRE(5 > std::numeric_limits<double>::min()); // works
//REQUIRE(5 > X::min); // lnk2019
}
//int main()
//{
// std::cout << (X::min < 5) << std::endl; // works
// return 0;
//}
最后REQUIRE
评论的确切错误消息是:
Error LNK2019 unresolved external symbol "public: static double const X::min" (?min@X@@2NB) referenced in function "int
void __cdecl anonymous namespace'::
dynamic initializer for 'autoRegistrar11''(void)'::1'::dtor$2" (?dtor$2@?0???__EautoRegistrar11@?A@@YAXXZ@4HA) quicktest ...\quicktest\quicktest.obj 1
幸运的是,解决方法很简单,但我想知道问题的确切原因是什么。实际上,我不知道它是源自 catch 还是源自编译器或其他任何东西。有人知道吗?