我有一个静态库说“ A.lib ”,其中包含一个函数int foo()
。我有另一个dll说“ B.dll ”消耗 A.lib 并使用函数foo()
并导出一些其他函数。是否可以从B.dll导出函数int foo()
(从A.lib导入),以便可以在第三个dll中使用“ C.dll ”。
我想知道是否可能,我不想要像 C.dll 那样使 A.lib 可用的解决方法。此外,我不担心这是否是一个糟糕的设计。
非常感谢您耐心阅读本文。
答案 0 :(得分:0)
是的,这是可能的,但任何代码示例都取决于语言。 (例如在C中你可以简单地导出一个具有相同名称的函数,而C.dll将会看到它)
答案 1 :(得分:0)
我有同样的要求 - 只是找到了不同的解决方案:
假设A.lib有A.h(由用于构建B.dll的源文件消耗,例如假设A.h包含A.lib中包含的函数的原型),只需在A.h中添加以下内容:
#pragma comment(linker, "/export:_foo")
这将指示链接器在构建B.dll时导出foo()
。请注意前导下划线 - 它存在,因为它是A.lib中包含的foo()
符号的真实名称(使用dumpbin /symbols A.lib | findstr foo
来查看它)。在我的示例foo()
中使用__cdecl
调用约定,但如果您使用__stdcall()
或编译为C ++,您将获得不同的名称修饰,因此您将拥有作为结果调整上面的#pragma
语句。
如果B.hll中的许多源文件包含A.h并不重要 - 如果多次完全相同的定义,链接器不会抱怨。
一个优点"对于这种方法,您甚至不必使用A.lib中__declspec(dllexport)
上的foo()
说明符...