能力值:
( LV3,RANK:20 )
2 楼
如果B是DLL而且你没有代码,这时候你想把它从弄成静态LIB,并且以后不再需要使用DLL的话,就我所知,应该没有方法。
能力值:
( LV2,RANK:10 )
3 楼
嗯,B没有源代码,但是依照其接口已经重新做了实现,新的实现有源代码并且能编译为static lib C
直接转换dll也是可以的,dll2lib 应该就可以。这次因为需要修改实现本身,所以没有采用这种方法。
现在的问题是没办法将一个链接到动态库(B)的static library (A)转为链接到静态库 (C)
能力值:
( LV3,RANK:20 )
4 楼
题外话,dll2lib转了以后,还是需要DLL才能运行。
既然你已经重新实现了B这个DLL,并且弄成C这个静态lib,那么你的任务应该可以完成。
你的Exe工程应该指明链接A.lib和C.lib两个lib文件,这样的话应该会有一个警告说“xx本地符号在yy中被导入”,不过不影响正常执行。
你现在的错误提示是什么?
能力值:
( LV2,RANK:10 )
5 楼
嗯,dll2lib我确实没有亲自用过,不过之前详细看了它的官方文档,应该是可以直接转换dll为static lib,并不是生成可以使用dll的lib, 转换后的lib需要自己处理dllmain的调用以及resource confict的问题 (resource是相对于module的,static library本身不是一个module)
我编译的遇到的错误:
error LNK2019: unresolved external symbol __imp__xxx referenced in function xxx
无论是将C.lib链接到最终的exe还是A.lib(这两种情况应该一样) 都提示上面的错误
能力值:
( LV2,RANK:10 )
6 楼
补充一下,在static library c中 使用的函数 我分别声明为 __declspec(dllexport) __declspec(dllimport) 和 无任何修饰符3种情况,都不行
你给的提示应该是指warning LNK4217 是吧
Error Message
locally defined symbol 'symbol' imported in function 'function'
__declspec(dllimport) was specified for a symbol even though the symbol is defined locally
我在命令行下使用link测试了一下,发现只有当两者都是obj时,link 才会认为是local define,否则只要其中一者在lib当中,那么便会出现 无法找到符号的情况
但是与测试的结果相悖的是,在我的实际的project中,两个static lib的链接,其中部分函数 出现locally defined 的情况【不知道linker是怎么处理的】,而另一部分则找不到定义【与预期相同】。
能力值:
( LV2,RANK:10 )
7 楼
我感觉干脆把DLL放到资源里得了,用的时候释放出来,用完了删了或者不删看着办,最简单了
能力值:
( LV2,RANK:10 )
8 楼
可能是我没把问题说明白,不是怎么保存dll的问题,而是需要替换dll的实现
而且链接方式必须是静态而不能是动态,否则可能会产生重入性问题
能力值:
( LV3,RANK:20 )
9 楼
既然你说是一部分找得到,一部分找不到,很可能是这个原因:
比如这样一个函数__declspec(dllexport) int __stdcall func(int),在原先B这个DLL中,它可能通过.def文件指定导出函数名,所以它的名称是__imp__func;在C这个lib中,用export和import都不正确,只能使用extern "C" int __stdcall func(int),但是这样一来,它的名称却是func@4,本来应该是func才能链接上(提示LNK4217),现在多了一个@4就链接不上了。
可能用UE打开C.lib,把func@4改成func多出来的两字节用'\0'补上试试。
对了,你说的可以直接将dll转换成lib,并且以后都不需要dll的那个工具,可以共享下么?我只找得到需要依赖dll的那种。
能力值:
( LV9,RANK:170 )
10 楼
海风没来,大家在讨论dll2lib
能力值:
( LV2,RANK:10 )
11 楼
嗯,和你讨论的时候我是使用重新写的一个简单project的测试的,测试的时候没考虑_stdcall修饰符的情况,我再试一下。
不过在原始的project中,locally defined和unresolved name两类函数在B中都是export(我并没有认真调查是如何export的,def和声明__declspec(dllexport)应该是一样的吧)并且声明为_stdcall, 在A里面有时候是被同一个函数调用(假定为f),因此链接时出现了一个函数在f中
locally defined,另一个是unresolved name,让我很纳闷
我猜测连接器会按照调用约定自己处理@n的情况:
locally defined symbol xxxx@4 imported in function zzzz 那个软件的名字就叫做dll2lib,我没有对名字加混淆哦:-)
官方网站
http://www.binary-soft.com/dll2lib/dll2lib.htm