如果我在.lib(库)文件中找到未解析的外部符号,我该怎么办?如果我在.c或.cpp中找到未解析的外部符号,我可以修复它。但是当我在.lib(库)文件中找到未解析的外部符号时,我该如何解决这个问题?
在我的情况下,我发现了一个像这样的链接器错误:
错误1错误LNK2019:函数_fprintf中引用的未解析外部符号___mingw_vfprintf D:\ VidPlaya_offline \ TryingToIncludeUpdateFacility \ Vidplaya_Plugin_EmbeddedUpdate \ vlcwin \ libvlccore \ libgcrypt.lib(libgcrypt_la-global.o) 错误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中引用的未解析的外部符号_gpg_strerror D:\ VidPlaya_offline \ TryingToIncludeUpdateFacility \ Vidplaya_Plugin_EmbeddedUpdate \ vlcwin \ libvlccore \ libgcrypt.lib(libgcrypt_la-global.o) 错误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中引用的未解析的外部符号_gpg_strsource D:\ VidPlaya_offline \ TryingToIncludeUpdateFacility \ Vidplaya_Plugin_EmbeddedUpdate \ vlcwin \ libvlccore \ libgcrypt.lib(libgcrypt_la-global.o) 错误9错误LNK2019:函数_do_malloc中引用的未解析的外部符号_gpg_err_set_errno D:\ VidPlaya_offline \ TryingToIncludeUpdateFacility \ Vidplaya_Plugin_EmbeddedUpdate \ vlcwin \ libvlccore \ libgcrypt.lib(libgcrypt_la-global.o) 错误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中引用的未解析的外部符号_gpg_err_code_from_errno D:\ VidPlaya_offline \ TryingToIncludeUpdateFacility \ Vidplaya_Plugin_EmbeddedUpdate \ vlcwin \ libvlccore \ libgcrypt.lib(libgcrypt_la-global.o) 错误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:函数_sprintf中引用的未解析的外部符号___mingw_vsprintf 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中引用的未解析的外部符号_snprintf D:\ VidPlaya_offline \ TryingToIncludeUpdateFacility \ Vidplaya_Plugin_EmbeddedUpdate \ vlcwin \ libvlccore \ libgcrypt.lib(pubkey.o) 错误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中引用的未解析的外部符号_getpagesize D:\ VidPlaya_offline \ TryingToIncludeUpdateFacility \ Vidplaya_Plugin_EmbeddedUpdate \ vlcwin \ libvlccore \ libgcrypt.lib(libgcrypt_la-secmem.o) 错误32错误LNK2019:函数_x931_get_dt中引用的未解析的外部符号_gettimeofday D:\ VidPlaya_offline \ TryingToIncludeUpdateFacility \ Vidplaya_Plugin_EmbeddedUpdate \ vlcwin \ libvlccore \ libgcrypt.lib(random-fips.o) 错误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:virtual struct 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
对此有任何建议会有所帮助。
答案 0 :(得分:2)
好吧,基本上你必须找到具有该符号的库 - .lib或.a(取决于平台)文件。静态库在链接到可执行文件或共享库之前不会解析它们的符号,因此您可能有一个静态库没有解析所有符号。您可以使用第1点中提到的工具对此进行验证 - 当您转储符号时,未解析的符号将在它们之前有U
个字母。当您将它们链接到应用程序时,链接器必须解析所有符号,如果缺少某些符号,则会得到未解决的引用错误。你基本上有两个选择:
1)使用符号转储实用程序,如nm
(Windows上为Linux和MinGW)或dumpbin
(Windows上为Visual Studio),grep为符号(如果您有一个充满库的目录)可以创建一个为每个文件执行此操作的脚本),然后当您知道正确的库文件将代码链接到它时(再次依赖于Linux和MinGW窗口的平台-l<library name>
开关,添加#pragma comment(lib, "<library name>")
或通过Visual Studio中的属性页指定库。
2)如果您拥有所有库的源,则可以对该函数的定义进行纯文本搜索,然后链接到源应该执行的库。
3)即使您已经链接到正确的库但C和C ++代码混合在一起,这些问题也可能出现。具有C接口的库应该将其头部包含在extern "C"
块中,以便当只有具有C名称的函数可用时,链接器不会尝试查找具有C ++名称的函数。对于使用FFmpeg和其他大型开源项目的初学者来说,这是一个常见问题。
<强>更新强>
关于__mingw_vfprinf
的原始问题 - 将MinGW编译的代码与Visual Studio链接起来有点奇怪,我说你最好使用它MinGW也适用于您的项目,但正如similar topic中所建议的那样,这可能是因为缺少libmingwex.a
。如果您有MinGW工具链,找到文件所在的位置,通过Visual Studio属性页将该目录添加到链接器搜索目录,并通过Visual Studio属性页或通过以下方法将libmingwex.a
作为链接器输入添加到项目中上面提到的pragma。如果您没有MinGW工具链,那么您应该下载它,但是您需要获得正确的平台 - 但是我想,因为你知道它是某个地方你知道它是32位还是64位。
更新2
以下是MinGW包管理器的示例屏幕截图,显示了哪个包包含库:
答案 1 :(得分:1)
我对其他运行时库实现的经验使我假设通过调用较低级别printf
表单来实现各种vprintf
变体。 fprintf
被放入了.o文件中(为什么?这本身不是RTL函数吗?)并且它需要帮助函数。从名称装饰,我希望在mingw系统库中找到它。我相信printf函数在你需要链接的补充库中,因为它比msvcrt.dll中的那些增强了。
所以,寻找那个。检查您的版本,因为lib可能是针对与您现在使用的版本不同的版本而构建的,并且这些细节已经更改。