- 主题:请教一个dll调用dll的问题
现在有一个a.dll和它的导出库a.lib,没有源代码,可以调用它们做exe ,没有问题。可是当我用它们再包装一个b.dll供其它程序调用的时候,就是出各种问题,C++的程序找不到a里面的函数,python的程序干脆cdll.LoadLibrary(r"b.dll")的时候就出错。
我在b.dll工程中,直接include 的头文件,链接时使用的a.lib,没有在程序里使用LoadLibrary()进行调用。请教大家,是不是这个办法不行,应该如何做?
--
FROM 114.242.17.*
这个肯定不是目录的问题,因为我在b.dll把引用a.dll的函数删掉,其它函数的运行没问题,在python里也能调用。如果把那个函数加上,就不行了,直接报错
FileNotFoundError: Could not find module 'b.dll' (or one of its dependencies). Try using the full path with constructor syntax.
在C++里一开始会报错找不到a.dll,这个是目录问题,把.lib,.dll都搞到当前目录,结果Load时倒是不报错了,就是运行时,运行到调用a.dll里面的函数时,找不到函数。
以前搞过类似的都是a.lib的静态库,现在是dll+.lib导出库就会导致这个问题,不知道是哪里的搞法不对。
【 在 z16166 的大作中提到: 】
: 搞法应该没问题
: call stack中应该能看到a.dll导出的public函数。那些没导出的函数等,是必须有私有符号a.pdb才能看到的。
: python应该是直接调用的os api LoadLibraryW()之类的来加载b.dll的,只跟当前进程的search path有关,也就是到什么目录下去找要加载的dll。
: ...................
--
FROM 114.242.17.*
不是这样,把a.dll,a.lib,b.dll都放在同一目录,也是一样的现象,python程序里用的是cdll.LoadLibrary('b.dll'),当b.dll里面不包含a.dll里面的函数时,这个load是成功的,其它函数也能正常调用,当增加了调用a.dll的函数时,这个LoadLibrary就会失败。这点确实很诡异,不太理解为什么。
找不到函数是b.exe里可以跟踪到b.dll里的函数,但是a.dll里的函数a调用失败,调试时的错误信息就是找不到函数。
【 在 Bernstein 的大作中提到: 】
: 基本上可以确定是目录的问题,找不到a.dll,才会在加载dll阶段报错;c++的程序不就是说明这一点了吗?
: 至于“运行时调到a.dll里的函数时,找不到函数”,不明白你出了什么问题?是函数不能工作?还是调试器里跟踪不进去?后者的话,那是因为没有调试符号,很正常。
:
--
FROM 114.242.17.*
a.lib和a.dll是一致的,没问题,因为我首先是用C++做了个exe,调用这个a.dll,一切正常。然后把这个exe改写成dll,供python调用,这里就出问题了。我之前都是引用的静态库,从来没有在动态库里使用动态库的导出lib去链接过,不知道这样行不行,你这么用过吗?
【 在 Bernstein 的大作中提到: 】
: python那个说明a.dll加载失败了
: 至于从b.dll调用a.dll里的函数,报错找不到,这个不太可能啊,找不到的话,你链接的时候为什么可以通过呢?除非a.lib和a.dll是不匹配的,a.lib包含了这个函数,但a.dll不包含。
: a.dll导出的函数可以看到么?比如用depends这个工具
: ...................
--
FROM 114.242.17.*
我看了depends,b.dll已经包含上了a.dll,也能看到导出函数,不过只有一个CreateInstance能看出名字,其它的函数是乱码。
这里a实际上是两个dll,应该是b调用a2.dll,a2.dll调用a1.dll。
两个a的导出函数是C++的,b.dll的导出函数是C的,这点应该没有什么影响吧?
【 在 Bernstein 的大作中提到: 】
: 肯定是可以的,大量使用过
: 你用depends分别加载b.dll和a.dll试试,看有说明问题,估计是一些细节
:
--
FROM 114.242.17.*
多谢,确实是个细节。
之前一直用这个宏进行导出
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) int funcA();
__declspec(dllexport) int funcB();
#ifdef __cplusplus
}
#endif
但是最后发现加了使用a.dll的函数funcB后,这个宏__cplusplus失效了,没搞懂为什么。
干脆把这个宏判断去掉,直接extern "C",就好了。
【 在 Bernstein 的大作中提到: 】
: 肯定是可以的,大量使用过
: 你用depends分别加载b.dll和a.dll试试,看有说明问题,估计是一些细节
:
--
FROM 114.242.17.*