由于lib文件中包含着dll文件信息,所以直接修改lib名,在链接器进行链接的时候,lib文件中的内容没有发生变化,结果就是在程序运行时,程序还是会寻找命名为原来名的dll文件。所以我们直接修改相应的lib文件和dll文件名将会导致程序找不到dll文件
运行环境:wind10+vs2015+x64
修改方法:(以把tensorflow_cc.dll修改为tensorflow.dll为例)
- 首先通过dumpbin工具导出dll中的内容
DUMPBIN /path/tensorflow_cc.dll /EXPORTS /OUT:/path/tensorflow.def- 通过文本编辑器打开tensorflow.def ,内容如下。
Dump of file D:\Project\SciDnnDll\DependencyDll\tensorflow_cc.dll
File Type: DLL
Section contains the following exports for tensorflow_cc.dll
00000000 characteristics
5DE87B88 time date stamp Thu Dec 5 11:37:44 2019
0.00 version
1 ordinal base
3131 number of functions
3131 number of names
ordinal hint RVA name
1 0 0304C6A0 ??$CreateMaybeMessage@VGPUOptions@tensorflow@@$$V@Arena@protobuf@google@@CAPEAVGPUOptions@tensorflow@@PEAV012@@Z
2 1 0307F3F0 ??$CreateMaybeMessage@VNodeDef@tensorflow@@$$V@Arena@protobuf@google@@CAPEAVNodeDef@tensorflow@@PEAV012@@Z
3 2 023EFF40 ??0?$MaybeStackArray@D$0CI@@icu_62@@AEAA@AEBV01@@Z
.
.
.
3130 C39 028FA770 utrie_unserializeDummy_62
3131 C3A 028FA900 utrie_unserialize_62
Summary
36A000 .data
1000 .gfids
1F8000 .pdata
1047000 .rdata
65000 .reloc
32E0000 .text
1000 .tls
11000 _RDATA
- 对文件进行整理,得到如下内容(用python操作更简单)。
EXPORTS
??$CreateMaybeMessage@VGPUOptions@tensorflow@@$$V@Arena@protobuf@google@@CAPEAVGPUOptions@tensorflow@@PEAV012@@Z @1
??$CreateMaybeMessage@VNodeDef@tensorflow@@$$V@Arena@protobuf@google@@CAPEAVNodeDef@tensorflow@@PEAV012@@Z @2
??0?$MaybeStackArray@D$0CI@@icu_62@@AEAA@AEBV01@@Z @3
.
.
.
utrie_unserializeDummy_62 @3130
utrie_unserialize_62 @3131
- 利用vs工具lib重新生成改名后的lib文件(我的机器是64位)
LIB /DEF:/path/tensorflow.def /machine:X64 /OUT:/path/tensorflow.lib- 得到tensorflow.lib后,然后对tensorflow_cc.dll进行改名为tensorflow.dll即完成dll名称的修改。
期间遇到的问题:def文件中存在LIBRARY等语句时LIB识别不了文件(据我猜测,可能是由于版本和参考资料不同的问题)
参考资料:
https://blog.csdn.net/WL2002200/article/details/51418372/
http://suddymail.org/show-160-1.html
https://blog.csdn.net/b2292486308/article/details/53762806/