6

I've downloaded, built and added to the project the {fmt} 6.2.1 library on c++. I'm using Windows.

Problem is, the headers are recognized(Code:Blocks give me the auto-completion for them) but any function I try to use results in errors.

For example this code:

#include <iostream>
#include<fmt-6.1.2/include/fmt/core.h>
#include<fmt-6.1.2/include/fmt/format.h>

int main()
{
    auto msg1 = fmt::format("The answer is {}", 42);
    return 0;
}

produces this error

||=== Build: Debug in test libreria fmt (compiler: GNU GCC Compiler) ===|
obj\Debug\main.o||In function `ZN3fmt2v68internal16is_integral_typeENS1_4typeE':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\core.h|736|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal18is_arithmetic_typeENS1_4typeE':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\core.h|741|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v612format_errorC1EPKc':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|693|undefined reference to `vtable for fmt::v6::format_error'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12count_digitsEy':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|751|undefined reference to `fmt::v6::internal::basic_data<void>::zero_or_powers_of_10_64'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|751|undefined reference to `fmt::v6::internal::basic_data<void>::zero_or_powers_of_10_64'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12count_digitsEj':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|809|undefined reference to `fmt::v6::internal::basic_data<void>::zero_or_powers_of_10_32'|
obj\Debug\main.o||In function `ZN3fmt2v68internal11to_unsignedIiEENSt13make_unsignedIT_E4typeES4_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\core.h|266|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZZN3fmt2v68internal19parse_format_stringILb0EcRNS0_14format_handlerINS0_13arg_formatterINS0_12buffer_rangeIcEEEEcNS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEEEvNS0_17basic_string_viewIT0_EEOT1_EN10pfs_writerclEPKcSN_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2510|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal19parse_format_stringILb0EcRNS0_14format_handlerINS0_13arg_formatterINS0_12buffer_rangeIcEEEEcNS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEEEvNS0_17basic_string_viewIT0_EEOT1_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2527|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2541|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2543|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12parse_arg_idIcNS1_10id_adapterIRNS0_14format_handlerINS0_13arg_formatterINS0_12buffer_rangeIcEEEEcNS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEcEEEEPKT_SK_SK_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2278|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v614format_handlerINS0_13arg_formatterINS0_12buffer_rangeIcEEEEcNS0_20basic_format_contextISt20back_insert_iteratorINS0_8internal6bufferIcEEEcEEE15on_format_specsEPKcSF_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|3133|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v616visit_format_argINS0_13arg_formatterINS0_12buffer_rangeIcEEEENS0_20basic_format_contextISt20back_insert_iteratorINS0_8internal6bufferIcEEEcEEEEDTclfp_Li0EEEOT_RKNS0_16basic_format_argIT0_EE':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\core.h|1012|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal21parse_nonnegative_intIcRNS1_10id_adapterIRNS0_14format_handlerINS0_13arg_formatterINS0_12buffer_rangeIcEEEEcNS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEcEEEEiRPKT_SL_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1928|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal10id_adapterIRNS0_14format_handlerINS0_13arg_formatterINS0_12buffer_rangeIcEEEEcNS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEcE8on_errorEPKc':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2493|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v616visit_format_argIRNS0_8internal16custom_formatterINS0_20basic_format_contextISt20back_insert_iteratorINS2_6bufferIcEEEcEEEES9_EEDTclfp_Li0EEEOT_RKNS0_16basic_format_argIT0_EE':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\core.h|1012|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v626basic_format_parse_contextIcNS0_8internal13error_handlerEE8on_errorEPKc':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\core.h|532|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal18arg_formatter_baseINS0_12buffer_rangeIcEENS1_13error_handlerEEclENS0_9monostateE':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1836|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal11parse_alignIcRNS1_13specs_checkerINS1_13specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEENS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEEEEEPKT_SJ_SJ_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2342|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal11parse_widthIcRNS1_13specs_checkerINS1_13specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEENS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEEEEEPKT_SJ_SJ_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2382|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v620basic_format_contextISt20back_insert_iteratorINS0_8internal6bufferIcEEEcE8on_errorEPKc':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\core.h|1169|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal17handle_char_specsIcNS1_18arg_formatter_baseINS0_12buffer_rangeIcEENS1_13error_handlerEE17char_spec_handlerEEEvPKNS0_18basic_format_specsIT_EEOT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1280|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12basic_writerINS0_12buffer_rangeIcEEE5writeIfLi0EEEvT_NS0_18basic_format_specsIcEE':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1694|undefined reference to `fmt::v6::internal::basic_data<void>::signs'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1703|undefined reference to `fmt::v6::internal::basic_data<void>::signs'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1704|undefined reference to `int fmt::v6::internal::snprintf_float<double>(double, int, fmt::v6::internal::float_specs, fmt::v6::internal::buffer<char>&)'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1713|undefined reference to `int fmt::v6::internal::format_float<double>(double, int, fmt::v6::internal::float_specs, fmt::v6::internal::buffer<char>&)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12basic_writerINS0_12buffer_rangeIcEEE5writeIdLi0EEEvT_NS0_18basic_format_specsIcEE':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1694|undefined reference to `fmt::v6::internal::basic_data<void>::signs'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1703|undefined reference to `fmt::v6::internal::basic_data<void>::signs'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1704|undefined reference to `int fmt::v6::internal::snprintf_float<double>(double, int, fmt::v6::internal::float_specs, fmt::v6::internal::buffer<char>&)'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1713|undefined reference to `int fmt::v6::internal::format_float<double>(double, int, fmt::v6::internal::float_specs, fmt::v6::internal::buffer<char>&)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12basic_writerINS0_12buffer_rangeIcEEE5writeIeLi0EEEvT_NS0_18basic_format_specsIcEE':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1694|undefined reference to `fmt::v6::internal::basic_data<void>::signs'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1703|undefined reference to `fmt::v6::internal::basic_data<void>::signs'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1704|undefined reference to `int fmt::v6::internal::snprintf_float<long double>(long double, int, fmt::v6::internal::float_specs, fmt::v6::internal::buffer<char>&)'|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1713|undefined reference to `int fmt::v6::internal::format_float<long double>(long double, int, fmt::v6::internal::float_specs, fmt::v6::internal::buffer<char>&)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal18arg_formatter_baseINS0_12buffer_rangeIcEENS1_13error_handlerEE5writeEPKc':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1823|undefined reference to `fmt::v6::format_error::~format_error()'|
obj\Debug\main.o||In function `ZN3fmt2v68internal24handle_cstring_type_specIcNS1_18arg_formatter_baseINS0_12buffer_rangeIcEENS1_13error_handlerEE20cstring_spec_handlerEEEvT_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1291|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal22check_string_type_specIcNS1_13error_handlerEEEvT_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1296|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal23check_pointer_type_specIcNS1_13error_handlerEEEvT_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1301|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal21parse_nonnegative_intIcRNS1_13specs_checkerINS1_13specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEENS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEEEEEiRPKT_SJ_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1928|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12parse_arg_idIcNS1_13width_adapterIRNS1_13specs_checkerINS1_13specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEENS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEEEcEEEEPKT_SL_SL_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2278|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12parse_arg_idIcNS1_17precision_adapterIRNS1_13specs_checkerINS1_13specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEENS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEEEcEEEEPKT_SL_SL_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|2278|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal21parse_float_type_specINS1_13error_handlerEcEENS1_11float_specsERKNS0_18basic_format_specsIT0_EEOT_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1268|undefined reference to `fmt::v6::internal::error_handler::on_error(char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal13decimal_pointIcEET_NS1_10locale_refE':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|831|undefined reference to `char fmt::v6::internal::decimal_point_impl<char>(fmt::v6::internal::locale_ref)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal21parse_nonnegative_intIcRNS1_13width_adapterIRNS1_13specs_checkerINS1_13specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEENS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEEEcEEEEiRPKT_SM_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1928|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal21parse_nonnegative_intIcRNS1_17precision_adapterIRNS1_13specs_checkerINS1_13specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEENS0_20basic_format_contextISt20back_insert_iteratorINS1_6bufferIcEEEcEEEEEEcEEEEiRPKT_SM_OT0_':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1928|undefined reference to `fmt::v6::internal::assert_fail(char const*, int, char const*)'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12basic_writerINS0_12buffer_rangeIcEEE10int_writerIiNS0_18basic_format_specsIcEEE8on_errorEv':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1590|undefined reference to `fmt::v6::format_error::~format_error()'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12basic_writerINS0_12buffer_rangeIcEEE10int_writerIjNS0_18basic_format_specsIcEEE8on_errorEv':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1590|undefined reference to `fmt::v6::format_error::~format_error()'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12basic_writerINS0_12buffer_rangeIcEEE10int_writerIxNS0_18basic_format_specsIcEEE8on_errorEv':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1590|undefined reference to `fmt::v6::format_error::~format_error()'|
obj\Debug\main.o||In function `ZN3fmt2v68internal12basic_writerINS0_12buffer_rangeIcEEE10int_writerIyNS0_18basic_format_specsIcEEE8on_errorEv':|
D:\CodeBlocks\MinGW\include\fmt-6.1.2\include\fmt\format.h|1590|undefined reference to `fmt::v6::format_error::~format_error()'|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build failed: 50 error(s), 0 warning(s) (0 minute(s), 2 second(s)) ===|

and the compiler points me to this section of core.h, in the second line

FMT_CONSTEXPR bool is_integral_type(type t) {
  FMT_ASSERT(t != named_arg_type, "invalid argument type");
  return t > none_type && t <= last_integer_type;
}

It is the first time for me to use a library so I could have mistaken something while adding it. The procedure I've followed is to go on project->build options->linker settings and there I added the .lib files.

Thank you.

David
  • 123
  • 1
  • 10
  • Lot of advice how to link C++ libraries is in that question https://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix – Öö Tiib Dec 15 '19 at 22:14
  • You said, code block, you said windows. but what compiler? Anyway, your include can be improved by telling compiler inclusion path and include as #include as example, and you also need to tell your compiler where is the path for your imported library. – Popeye Dec 15 '19 at 22:30
  • Thank you that question is interesting :) But I still don't know what I did wrong, or if there is a problem in the library, because the question is only about an explanation of what that error is, with not many pratical suggestions. – David Dec 15 '19 at 22:55
  • I'm using GNU GCC Compiler. Where are Inclusion paths added? – David Dec 15 '19 at 22:57
  • Ok I have added the paths to the libraries on search directories->linker and compiler but the problem still persists – David Dec 15 '19 at 23:23
  • I've tried to rebuild the library with cmake and MSBuild but this time the building keeps failing. – David Dec 15 '19 at 23:56
  • 1
    This is probably not an alternative to use in production, but adding `#define FMT_HEADER_ONLY` before including the fmt headers builds the library along with your project. Does that work for you? – parktomatomi Dec 16 '19 at 00:48
  • Yes it compiles and seems to work. But why? And what should I do to have a code valid in production? Thank you parktomatomi – David Dec 16 '19 at 01:04
  • 1
    "Header only" means all the code of the library, including function defiitions, is in the header. Because of this, it doesn't need to link to an external library. The downside is that it is slower to compile, because it has to process all that code whenever a file `#includes` fmt. I probably shouldn't say "don't use in production", but rather "don't use in a big project" because the larger build times can be a pain. – parktomatomi Dec 16 '19 at 02:14
  • Because all functions are inline you mean? I see, thank you I didn't knew about this possibility. :) Still, I'll keep trying to use the library because my main goal is to learn how to do so, so if there is any other suggestion about it I'll gladly read it! – David Dec 16 '19 at 10:16
  • Ok I tried again, this time building the library with Visual Studio. Exact same result. The procedure I follow is this. I download the library, cmake it and then I build it with VS or MSBuild.exe. Then the library appears in a Debug folder along with the rest. I open CodeBlocks, go to linker settings and add the library, then on search directories and I add the path to the Debug folder in which the library is both on "Compiler" and "Linker". The compiler is Gnu GCC Compiler – David Dec 16 '19 at 12:54

1 Answers1

4

You should link with the fmt library. For example, if you are using CMake it can be done with target_link_libraries:

target_link_libraries(<target> fmt)
vitaut
  • 49,672
  • 25
  • 199
  • 336
  • Thank you for your suggestion. I'm a bit confused though... Can you please tell me where what you suggested must be done and where?(I mean if in CodeBlocks, on the Command Prompt, or in MSBuild/VS) I download the library, cmake it and then I build it with VS or MSBuild.exe. Then the library appears in a Debug folder along with the rest. I open CodeBlocks, go to linker settings and add the library, then on search directories and I add the path to the Debug folder in which the library is both on "Compiler" and "Linker". The compiler is Gnu GCC Compiler – David Dec 16 '19 at 17:35
  • 1
    Unfortunately I'm not familiar with CodeBlocks. In CMake you can create an executable target with add_executable and then link as I explained in the answer. Then you can generate the build files. – vitaut Dec 16 '19 at 19:38
  • I see! So it should be done from the command prompt right? Can you please make me an example of what to put in place of ? Should i put the .cpp containing the main? – David Dec 16 '19 at 19:45
  • You should put the target name. Please see https://cmake.org/cmake/help/latest/guide/tutorial/index.html for a CMake tutorial. – vitaut Dec 17 '19 at 15:17
  • I gave a look at the tutorial, but it is long and convoluted while I would simply like to know what is a target. Don't take it as an act of laziness or disrespect towards your suggestions, but I would prefer something straight to the point, not a lecture of 2 hours about the whole cmake. – David Dec 17 '19 at 15:37
  • 1
    You can think of a target as a binary or a library that you are building. In your case it will be a binary created with add_executable. – vitaut Dec 17 '19 at 17:03
  • Oh I see. Thank you :) I'll see if I can find a solution with this new knowledge. – David Dec 17 '19 at 17:31