无法解析的外部符号问题浅尝

在编译的时候经常会遇到无法解析的外部符号这类的编译错误,当遇到这种问题有些时候会花费我们很多的时间去解决,很多时候我们会去msdn查看这个符号在哪个lib库里面,但是并不是所有的符号在msdn中都有,这时我们可能会去网上查找看有没有人曾经遇到过类似的问题,因此会花费我们很多的时间,所以本人经过研究尝试写了一个批处理帮助快速解决此类问题。

@echo off  
setlocal  
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"  
set BAT_ROOT=%~dp0
set findSymTempFile="%BAT_ROOT%findSymTemp.txt" 
for /F "tokens=1,2 usebackq delims=," %%i in ("%BAT_ROOT%LibPaths.list") do (  
    if "%%i" == "search" (  
        cd /d "%%j" 
        for /F "tokens=1 delims=" %%a in ('dir *.lib /A- /B /S') do (  
            @echo %%~fa
            dumpbin /all /rawdata:none "%%~fa" >%findSymTempFile%
            findstr /i "%~n0" %findSymTempFile% && echo "你所查找的外部符号所在的库为:" && echo %%~fa && pause && goto :stop            
        )  
    )  
) 
:stop
del %findSymTempFile%
endlocal  
goto :eof

用法:
1.将以上脚本保存成.bat或.cmd格式的文件临时命名为SearchLib.bat
2.LibPaths.list文件中存放*.lib文件路径(格式如:search,”D:/Ogre/ode-0.14/lib/DebugDoubleDLL/”)通过换行可添加多个
3.将SearchLib.bat和LibPaths.list放在任意同一个文件目录下
4.文件名为SearchLib.bat文件的名字修改为所要查找的无法解析的外部符号的名字(去掉前面的_imp到左边第一个字母中间的字符)
如:1>Ci_3DCacheLayer.obj : error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl CPointCloudSet::~CPointCloudSet(void)”
(_imp??1CPointCloudSet@@QEAA@XZ)
取最右边括号中的名字CPointCloudSet@@QEAA@XZ
5.双击运行修改名字后的文件CPointCloudSet@@[email protected]即可
6.未出现任何结果代表你添加的路径中*.lib未包含所要查找的符号
7.注意用其他软件如Notepad++打开脚本时,保证编码格式为ANSI
总结:
通过上面批处理可以快速定位无法解析的外部符号这类的问题,如果没有找到所需lib,代表你的编译的或者SDK中的lib不是最新的版本或者编译时将所需要的符号所在的CPP文件排除在编译外了

你可能感兴趣的:(C++编译,随笔)