美文网首页
解决链接第三方库时报错error LNK2001: 无法解析的外

解决链接第三方库时报错error LNK2001: 无法解析的外

作者: 叶迎宪 | 来源:发表于2022-08-16 19:01 被阅读0次

用vs 2022链接一个第三方的.a静态库,结果报错 error LNK2001: 无法解析的外部符号 printf

解决方法参考
https://stackoverflow.com/questions/64413414/unresolved-external-symbol-printf-in-windows-x64-assembly-programming-with-nasm

在工程中额外链接一个 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这个库中,所有标准库函数都是按照函数名实现的。

相关文章

网友评论

      本文标题:解决链接第三方库时报错error LNK2001: 无法解析的外

      本文链接:https://www.haomeiwen.com/subject/vgfdgrtx.html