当前位置:C++技术网 > 资讯 > 完美解决无法解析的外部符号 __imp___vsnprintf问题

完美解决无法解析的外部符号 __imp___vsnprintf问题

更新时间:2016-05-23 14:44:13浏览次数:1+次

    在做Excel导出功能的时候,链接时,出现这样的一个错误提示:

odbccp32.lib(dllload.obj) : error LNK2001: 无法解析的外部符号 __imp___vsnprintf

    我想这个应该是没有导入odbccp32.lib库,所以就导入了一下。为了方便代码移植,就用了下面这句代码导入:


#pragma comment(lib,"odbccp32.lib")
    然后重新编译链接,结果发现,还是同样的错误提示。一般这样的lib库都应该在系统目录下,然而这个并不是。通过上网查资料了解了基本信息,然后发现odbcccp32.lib并不在系统目录下,而是在C:\Program Files\下面的多个目录中,而且,不同的目录下面的lib都不一样,并且环境变量中并没有此lib所在的目录,所以,系统无法搜索到odbcccp32.lib,自然就提示了无法解析的外部符号。。。


    我的系统环境变量是这样的:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;%USERPROFILE%\.dnx\bin;C:\Program Files\Microsoft DNX\Dnvm\;C:\Program Files\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\Git\cmd

    这么多变量中,没有C:\Program Files\,也没有odbcccp32.lib所在的目录,自然就搜索不到。当我在C:\Program Files\搜索odbcccp32.lib时,竟然出现了大量的版本,看下面的截图:

在C:\Program Files\搜索odbcccp32.lib时,竟然出现了大量的版本

    懵逼了吧。这可如何是好,哪个才是正确的版本呢?没事,哥已经测试了一遍,我的系统是win7 32位的,所以倒数第四个版本就是正确的,图中已经标注的很清楚了。如果你是win7 64位的系统,可能倒数第四倒数第五都可以吧。不过只有试了才知道,我就没有试64位的了,请君自测。

    不过这个正确的版本竟然显示的是win8目录下的,好混乱。不过不管这么多了,能用就好,有时候微软就是有点小混乱,我们也无法理解。

    那么我们只要将这个lib正确导入就可以了。我们要么将这个目录添加到环境变量,是最长的一级,不是C:\Program Files\,这样才可以确保系统搜索到的是这个正确的版本。当然不建议改环境变量,这样太麻烦。那么你可以在导入lib库时用绝对路径导入,这样还不错。你可以在项目属性中填写,也可以直接用代码填写。

    不过我用代码导入,结果下面三种形式都不行:


#pragma comment(lib,"C:/Program Files/Windows Kits/8.0/Lib/win8/um/x86/odbccp32.lib")
#pragma comment(lib,"C:\\Program Files\\Windows Kits\\8.0\\Lib\\win8\\um\\x86\\odbccp32.lib")
#pragma comment(lib,"C:\Program Files\Windows Kits\8.0\Lib\win8\um\x86\odbccp32.lib")
     吐血。只有在项目属性中添加导入了,结果是可以的。不过在属性中导入,如果代码脱离这个项目,其他项目还得在属性中设置一下,很麻烦。这是项目移植经常遇到的问题。同时,还得考虑一个问题,那就是,如果别人的电脑没有这个lib怎么办?这很可能,比如人家的是XP系统,win10 系统。


    所以最好的办法,就是将这个lib文件复制,放入项目的代码文件夹中。这样再用代码导入,只需要像这样即可:


#pragma comment(lib,"odbccp32.lib")


    这样,移植性双重保障,代码移动后,不用重新设置项目属性,而且移动代码时同时复制lib,这样也不怕对方电脑没有这个lib。这样就完美解决了这个问题。