对于静态链接(static link):
目的:获知在使用静态链接的时候,编译器如何处理导入/导出函数的?
为此做了以下系列实验:
1:建立一个Library Module,输出Library.dll。其导出void Test1(),和void Test2()。
2:建立一个Test Module 输出Test.exe。
实验1:
Test Module静态链接Library.lib,但是没有调用任何Library.lib导出的函数(Test1和Test2)。使用Depends查看,在Module dependency tree view中没有Library.dll。
实验2:
Test Module静态链接Library.lib,调用函数Test1。使用Depends查看,Module dependency tree view 中显示Library.dll。选中Library.dll,Parent import function list view中显示:Test1;Export function list view中显示Test1, Test2。
这表明编译器分析了Test Module对Library Module的函数调用,知道哪些函数被调用,哪些函数没有被调用。
实验3:
在实验2的基础上,删掉Library.dll,再用Depends查看,这是Module dependcency tree view中依然显示Library.dll,但是提示无法找到该文件。选中Library.dll,Parent import function list view中显示Test1,但提示无法解析;Export function list view中没有内容显示。
这一点似乎说明编译的时候,Test Module并没有链接所有Library Module导出的函数,而仅仅是链接了被使用的函数。
实验4:在实验2的基础上,修改Library module,使之仅仅导出Test1,不再导出Test2。对于Test module不作任何修改。编译Library module以后,使用Depends查看Test.exe。发现Module dependency tree view中正常显示Library.dll。选中Library.dll,Parent import function list view中正常显示Test1;Export function list view中正常显示Test1。
这一点似乎验证了实验3的结论。