用vs 2022链接一个第三方的.a静态库,结果报错 error LNK2001: 无法解析的外部符号 printf
在工程中额外链接一个 legacy_stdio_definitions.lib
解析:问题产生的原因,是第三方库是采用gcc mingw编译的。而对于Visual c++,其标准库中的函数很多会被inline或者通过define重定向为其他函数名。printf在<stdio.h>中是这样定义的
_Check_return_opt_
_CRT_STDIO_INLINE int __CRTDECL printf(
_In_z_ _Printf_format_string_ char const* const _Format,
...)
#if defined _NO_CRT_STDIO_INLINE
;
#else
{
int _Result;
va_list _ArgList;
__crt_va_start(_ArgList, _Format);
_Result = _vfprintf_l(stdout, _Format, NULL, _ArgList);
__crt_va_end(_ArgList);
return _Result;
}
#endif
默认情况下,没有定义宏_NO_CRT_STDIO_INLINE,printf会被展开成内联函数,因此c运行库中不需要有printf的实现。但是如果我们在工程中定义了 _NO_CRT_STDIO_INLINE 呢?实测证明,如果预定义了宏 _NO_CRT_STDIO_INLINE,但是运行时c库选择的是多线程调试DLL(/MDd),则依然会报错“无法解析的外部符号 printf” 。如果运行库选择的是 多线程调试(/MTd),则编译通过。
而legacy_stdio_definitions.lib这个库中,所有标准库函数都是按照函数名实现的。
网友评论