提问人:Myanju 提问时间:10/16/2014 最后编辑:Myanju 更新时间:10/23/2014 访问量:3474
libgcrypt.lib 中未解析的外部符号
Unresolved external symbol in libgcrypt.lib
问:
如果我在 .lib(library) 文件中发现未解析的外部符号,我必须做什么。如果我在 .c 或 .cpp 中发现未解析的外部符号,我可以修复它。但是当我在.lib(library)文件中发现未解析的外部符号时,我该如何解决这个问题?
就我而言,我发现了一个链接器错误,如下所示:
错误 1 错误 LNK2019:函数 _fprintf D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-global.o) 中引用了未解析的外部___mingw_vfprintf符号 错误 2 错误 LNK2001:无法解析的外部符号___mingw_vfprintf D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-misc.o) 错误 3 错误 LNK2001:无法解析的外部符号_gpg_strerror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(ecc.o) 错误 4 错误 LNK2019:函数 __gcry_strerror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-global.o) 中引用了未解析的外部_gpg_strerror符号 错误 5 错误 LNK2001:无法解析的外部符号_gpg_strerror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-misc.o) 错误 6 错误 LNK2001:无法解析的外部符号_gpg_strerror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(md.o) 错误 7 错误 LNK2001:无法解析的外部符号_gpg_strerror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-fips.o) 错误 8 错误 LNK2019:函数 __gcry_strsource D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-global.o) 中引用了未解析的外部_gpg_strsource符号 错误 9 错误 LNK2019:函数 _do_malloc D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-global.o) 中引用了未解析的外部_gpg_err_set_errno符号 错误 10 错误 LNK2001:无法解析的外部符号_gpg_err_set_errno D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-stdmem.o) 错误 11 错误 LNK2001:无法解析的外部符号_gpg_err_set_errno D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-secmem.o) 错误 12 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_errno D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-module.o) 错误 13 错误 LNK2019:函数 _gpg_err_make_from_errno D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-global.o) 中引用了未解析的外部_gpg_err_code_from_errno符号 错误 14 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_errno D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-sexp.o) 错误 15 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_errno D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(md.o) 错误 16 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_errno D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(primegen.o) 错误 17 错误 LNK2019:功能中引用___mingw_vsprintf未解析的外部符号n _sprintf D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-sexp.o) 错误 18 错误 LNK2001:无法解析的外部符号___mingw_vsprintf D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(ac.o) 错误 19 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_syserror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(primegen.o) 错误 20 错误 LNK2019:函数 _progress D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(dsa.o) 中引用了未解析的外部_gpg_err_code_from_syserror符号 错误 21 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_syserror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(ecc.o) 错误 22 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_syserror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(random-fips.o) 错误 23 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_syserror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(mpicoder.o) 错误 24 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_syserror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(cipher.o) 错误 25 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_syserror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(pubkey.o) 错误 26 错误 LNK2001:无法解析的外部符号_gpg_err_code_from_syserror D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(kdf.o) 错误 27 错误 LNK2019:函数 __gcry_pk_get_keygrip D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(pubkey.o) 中引用了未解析的外部_snprintf符号 错误 28 错误 LNK2001:无法解析的外部符号_snprintf D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(md.o) 错误 29 错误 LNK2001:无法解析的外部符号_snprintf D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(ecc.o) 错误 30 错误 LNK2001:无法解析的外部符号_snprintf D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(rndw32.o) 错误 31 错误 LNK2019:函数 _init_pool D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(libgcrypt_la-secmem.o) 中引用了未解析的外部_getpagesize符号 错误 32 错误 LNK2019:函数 _x931_get_dt D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(random-fips.o) 中引用了未解析的外部_gettimeofday符号 错误 33 错误 LNK2001:无法解析的外部符号_gettimeofday D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\libvlccore\libgcrypt.lib(random-csprng.o) 错误 34 错误 LNK1120: 10 个未解析的外部 D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\Release\libvlccore.dll 错误 89 错误 LNK2001:未解析的外部符号“public:虚拟结构 QMetaObject const * __thiscall UpdateDialog::metaObject(void)const ” (?metaObject@UpdateDialog@@UBEPBUQMetaObject@@XZ) D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\lib_plugin\help.obj 错误 90 错误 LNK2001:未解析的外部符号“public: virtual void * __thiscall UpdateDialog::qt_metacast(char const *)” (?qt_metacast@UpdateDialog@@UAEPAXPBD@Z) D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\lib_plugin\help.obj 错误 91 错误 LNK2001:未解析的外部符号“public: virtual int __thiscall UpdateDialog::qt_metacall(enum QMetaObject::Call,int,void * *)” (?qt_metacall@UpdateDialog@@UAEHW4Call@QMetaObject@@HPAPAX@Z) D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\lib_plugin\help.obj 错误 92 错误 LNK1120:3 个未解决的外部 D:\VidPlaya_offline\TryingToIncludeUpdateFacility\Vidplaya_Plugin_EmbeddedUpdate\vlcwin\Release\plugins\lib_plugin.dll
有关此的任何建议都会有所帮助。
答:
我在其他运行时库实现方面的经验使我假设各种变体是通过调用较低级别的表单来实现的。 被放入 thay .o 文件中(为什么?这本身不就是RTL功能吗?它需要那个辅助函数。从名称装饰来看,我希望可以在 mingw 系统库中找到它。我相信printf函数位于您需要链接的补充库中,因为它比msvcrt.dll中的函数增强了。printf
vprintf
fprintf
所以,寻找那个。还要检查您的版本,因为该库可能是针对与您现在使用的版本不同的版本构建的,并且这些详细信息已更改。
评论
好吧,基本上你必须找到具有该符号的库 - .lib 或 .a(取决于平台)文件。静态库在链接到可执行文件或共享库之前不会解析其符号,因此您可能有一个静态库,但其所有符号都未解析。您可以使用第 1 点下面提到的工具验证这一点 - 当您转储符号时,未解析的符号前面会有一个字母。当您将它们链接到您的应用程序中时,链接器必须解析所有符号,如果缺少某些内容,则会出现未解决的引用错误。您基本上有两种选择:U
1)使用符号转储实用程序,例如(Windows上的Linux和MinGW)或(Windows上的Visual Studio)和符号grep(如果你有一个充满库的目录,你可以为每个文件创建一个脚本),然后当你知道正确的库文件时,将你的代码链接到它(再次取决于Linux和MinGW窗口的平台开关, 通过 Visual Studio 中的属性页添加或指定库。nm
dumpbin
-l<library name>
#pragma comment(lib, "<library name>")
2)如果你有所有库的源代码,你可以做一个纯文本搜索函数的定义,然后链接到有源代码的库应该做的。
3)即使您已经与正确的库链接,但C和C++代码混合在一起,这些问题也可能会出现。具有 C 接口的库应将其标头包含在块中,以便链接器在只有具有 C 名称的函数可用时不会尝试查找具有 C++ 名称的函数。对于使用 FFmpeg 和其他大型开源项目的初学者来说,这是一个常见问题。extern "C"
更新
至于最初的问题——你将用 MinGW 编译的代码与 Visual Studio 链接起来有点奇怪,我想说你最好也将 MinGW 用于你的项目,但正如在类似主题中建议的那样,这可能是由于缺少 .如果你有 MinGW 工具链,请找到文件所在的位置,通过 Visual Studio 属性页将该目录添加到链接器搜索目录,并通过 Visual Studio 属性页或通过上面提到的编译指示将链接器输入添加到项目中。如果你没有 MinGW 工具链,那么你应该下载它,但你需要找到合适的平台——但是我想既然你在某个地方得到了库,你就知道它是 32 位还是 64 位。__mingw_vfprinf
libmingwex.a
libmingwex.a
更新 2
下面是 MinGW 包管理器的示例屏幕截图,显示了哪个包包含该库:
评论
libmingwex.a
C:\MinGW\lib
C:\MinGW\mingw32\lib
mingw32-mingwrt
LNK2019
评论