我不能在 C++ 上使用 fmt 库头文件
Posted
技术标签:
【中文标题】我不能在 C++ 上使用 fmt 库头文件【英文标题】:I can't use fmt library headers on c++ 【发布时间】:2019-12-15 22:05:53 【问题描述】:我已经在 c++ 上下载、构建并添加了 fmt 6.2.1 库到项目中。我正在使用 Windows。
问题是,标头已被识别(代码:块为我提供自动完成功能)但我尝试使用的任何功能都会导致错误。
例如这段代码:
#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;
产生这个错误
||=== 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)) ===|
编译器将我指向 core.h 的这一部分,在第二行
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;
这是我第一次使用库,所以我在添加它时可能会弄错一些东西。 我遵循的过程是继续项目-> 构建选项-> 链接器设置,然后我添加了 .lib 文件。
谢谢。
【问题讨论】:
很多关于如何链接 C++ 库的建议都在那个问题***.com/questions/12573816/… 你说的是代码块,你说的是windows。但是什么编译器?无论如何,您可以通过告诉编译器包含路径和包含为 #include#define FMT_HEADER_ONLY
可以将库与您的项目一起构建。这对你有用吗?
“仅头文件”表示库的所有代码,包括函数定义,都在头文件中。因此,它不需要链接到外部库。缺点是编译速度较慢,因为它必须在文件#includes
fmt 时处理所有代码。我可能不应该说“不要在生产中使用”,而应该说“不要在大型项目中使用”,因为较大的构建时间可能会很痛苦。
【参考方案1】:
你应该链接到 fmt 库。例如,如果您使用 CMake,则可以使用 target_link_libraries
:
target_link_libraries(<target> fmt)
【讨论】:
感谢您的建议。不过我有点困惑......你能告诉我你的建议必须在哪里完成吗?(我的意思是如果在 CodeBlocks、命令提示符或 MSBuild/VS 中)我下载了库,cmake 它然后我用 VS 或 MSBuild.exe 构建它。然后该库与其他库一起出现在 Debug 文件夹中。我打开 CodeBlocks,转到链接器设置并添加库,然后在搜索目录中添加路径到 Debug 文件夹,其中库位于“编译器”和“链接器”上。编译器是 Gnu GCC Compiler 不幸的是,我不熟悉 CodeBlocks。在 CMake 中,您可以使用 add_executable 创建一个可执行目标,然后按照我在答案中的解释进行链接。然后就可以生成构建文件了。 我明白了!所以它应该从命令提示符下完成,对吗?你能给我举个例子来说明用什么代替以上是关于我不能在 C++ 上使用 fmt 库头文件的主要内容,如果未能解决你的问题,请参考以下文章
C 语言文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )