首页
社区
课程
招聘
[求助]请教:关于将调用dll转换为static library
发表于: 2009-10-7 14:35 7957

[求助]请教:关于将调用dll转换为static library

2009-10-7 14:35
7957
现在有一个static lib A(没有源代码),其依赖于一个dll B,但由于一些技术原因,需要将dll B也转换为 static lib,因此实现了static lib C

但是由于A编译的时候 对于 dll B中的函数调用 声明了 dllimport ,因此好像无法直接链接到C中的函数定义,提示符号找不到。 请问大家有什么好的办法?
谢谢!

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
如果B是DLL而且你没有代码,这时候你想把它从弄成静态LIB,并且以后不再需要使用DLL的话,就我所知,应该没有方法。
2009-10-7 14:41
0
雪    币: 212
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嗯,B没有源代码,但是依照其接口已经重新做了实现,新的实现有源代码并且能编译为static lib C

直接转换dll也是可以的,dll2lib 应该就可以。这次因为需要修改实现本身,所以没有采用这种方法。

现在的问题是没办法将一个链接到动态库(B)的static library (A)转为链接到静态库 (C)
2009-10-7 15:21
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
题外话,dll2lib转了以后,还是需要DLL才能运行。
既然你已经重新实现了B这个DLL,并且弄成C这个静态lib,那么你的任务应该可以完成。
你的Exe工程应该指明链接A.lib和C.lib两个lib文件,这样的话应该会有一个警告说“xx本地符号在yy中被导入”,不过不影响正常执行。
你现在的错误提示是什么?
2009-10-7 16:26
0
雪    币: 212
活跃值: (23)
能力值: ( 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(这两种情况应该一样) 都提示上面的错误
2009-10-7 19:17
0
雪    币: 212
活跃值: (23)
能力值: ( 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是怎么处理的】,而另一部分则找不到定义【与预期相同】。
2009-10-7 21:26
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我感觉干脆把DLL放到资源里得了,用的时候释放出来,用完了删了或者不删看着办,最简单了
2009-10-7 22:26
0
雪    币: 212
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
可能是我没把问题说明白,不是怎么保存dll的问题,而是需要替换dll的实现
而且链接方式必须是静态而不能是动态,否则可能会产生重入性问题
2009-10-7 23:32
0
雪    币: 359
活跃值: (41)
能力值: ( 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的那种。
2009-10-8 08:47
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
海风没来,大家在讨论dll2lib
2009-10-8 09:51
0
雪    币: 212
活跃值: (23)
能力值: ( 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
2009-10-8 10:14
0
游客
登录 | 注册 方可回帖
返回
//