Skip to content

import boost.ut doesn't work #713

@MathiasMagnus

Description

@MathiasMagnus

The simplest of ut test cases don't work when using modules.

#ifdef USEFUL_CXX_MODULES
import boost.ut;
import useful;
#else
#include <boost/ut.hpp>
#include <Useful.hpp>
#endif

std::string reference(std::string in) {
  const auto &facet = std::use_facet<std::ctype<char>>(std::locale::classic());
  for (auto &c : in) {
    c = facet.toupper(c);
  }
  return in;
}

int main(int, char* argv[]) {
  using namespace boost::ut;

  "capitalize"_test = [=] {
    expect(capitalize(argv[1]) == reference(argv[1]));
  };
}
add_executable(TestCapitalize Test.cpp)

target_compile_features(TestCapitalize PRIVATE cxx_std_23)

target_link_libraries(TestCapitalize PRIVATE
	Useful
	Boost::ut_module
)

When linking this executable using latest MSVC and latest CMake, it gives the following linker error:

[build] Test.cpp.obj : error LNK2019: unresolved external symbol "public: void __cdecl boost::ext::ut::v2_3_1::reporter_junit<class boost::ext::ut::v2_3_1::printer>::on<struct boost::ext::ut::v2_3_1::detail::eq_<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >(struct boost::ext::ut::v2_3_1::events::assertion_pass<struct boost::ext::ut::v2_3_1::detail::eq_<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >)" (??$on@U?$eq_@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@detail@v2_3_1@ut@ext@boost@@@?$reporter_junit@Vprinter@v2_3_1@ut@ext@boost@@@v2_3_1@ut@ext@boost@@QEAAXU?$assertion_pass@U?$eq_@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@detail@v2_3_1@ut@ext@boost@@@events@1234@@Z::<!boost.ut>) referenced in function "public: bool __cdecl boost::ext::ut::v2_3_1::runner<class boost::ext::ut::v2_3_1::reporter_junit<class boost::ext::ut::v2_3_1::printer>,16>::on<struct boost::ext::ut::v2_3_1::detail::eq_<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >(struct boost::ext::ut::v2_3_1::events::assertion<struct boost::ext::ut::v2_3_1::detail::eq_<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >)" (??$on@U?$eq_@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@detail@v2_3_1@ut@ext@boost@@@?$runner@V?$reporter_junit@Vprinter@v2_3_1@ut@ext@boost@@@v2_3_1@ut@ext@boost@@$MH0BA@@v2_3_1@ut@ext@boost@@QEAA_NU?$assertion@U?$eq_@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@detail@v2_3_1@ut@ext@boost@@@events@1234@@Z::<!boost.ut>)
[build] Test.cpp.obj : error LNK2019: unresolved external symbol "public: void __cdecl boost::ext::ut::v2_3_1::reporter_junit<class boost::ext::ut::v2_3_1::printer>::on<struct boost::ext::ut::v2_3_1::detail::eq_<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >(struct boost::ext::ut::v2_3_1::events::assertion_fail<struct boost::ext::ut::v2_3_1::detail::eq_<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >)" (??$on@U?$eq_@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@detail@v2_3_1@ut@ext@boost@@@?$reporter_junit@Vprinter@v2_3_1@ut@ext@boost@@@v2_3_1@ut@ext@boost@@QEAAXU?$assertion_fail@U?$eq_@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@detail@v2_3_1@ut@ext@boost@@@events@1234@@Z::<!boost.ut>) referenced in function "public: bool __cdecl boost::ext::ut::v2_3_1::runner<class boost::ext::ut::v2_3_1::reporter_junit<class boost::ext::ut::v2_3_1::printer>,16>::on<struct boost::ext::ut::v2_3_1::detail::eq_<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >(struct boost::ext::ut::v2_3_1::events::assertion<struct boost::ext::ut::v2_3_1::detail::eq_<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >)" (??$on@U?$eq_@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@detail@v2_3_1@ut@ext@boost@@@?$runner@V?$reporter_junit@Vprinter@v2_3_1@ut@ext@boost@@@v2_3_1@ut@ext@boost@@$MH0BA@@v2_3_1@ut@ext@boost@@QEAA_NU?$assertion@U?$eq_@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@detail@v2_3_1@ut@ext@boost@@@events@1234@@Z::<!boost.ut>)
[build] ut_module.lib(ut.cppm.obj) : error LNK2001: unresolved external symbol "struct boost::ext::ut::v2_3_1::detail::log[boost.ut] boost::ext::ut::v2_3_1::log" (?log@v2_3_1@ut@ext@boost@@3U0$$_Aboost.ut@@detail@1234@A)
[build] ut_module.lib(ut.cppm.obj) : error LNK2001: unresolved external symbol "struct boost::ext::ut::v2_3_1::detail::that_[boost.ut] boost::ext::ut::v2_3_1::that" (?that@v2_3_1@ut@ext@boost@@3Uthat_@$$_Aboost.ut@@detail@1234@A)
[build] ut_module.lib(ut.cppm.obj) : error LNK2001: unresolved external symbol "struct boost::ext::ut::v2_3_1::detail::tag[boost.ut] boost::ext::ut::v2_3_1::skip" (?skip@v2_3_1@ut@ext@boost@@3Utag@$$_Aboost.ut@@detail@1234@A)

I have found that there are no tests excercising consuming boost ut as a module, so I am not surprised that it's broken. I'm just (again, unsurprisingly) disappointed, that every single time I'm trying to use modules, something is always broken. I wasn't expecting it from Boost ut.

Edit: this is after having changed

- #if defined(_MSC_VER)
+ #if 0
  static inline int largc = __argc;
  static inline const char** largv = const_cast<const char**>(__argv);
#else

because __argc et al don't work when using modules. It depends on <cstdlib>, which is only available using std.compat.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions