Dynamic 我们可以导出通过静态库提供的函数吗

Dynamic 我们可以导出通过静态库提供的函数吗,dynamic,dll,static,import,export,Dynamic,Dll,Static,Import,Export,我有一个静态库,称为“a.lib”,它包含一个函数intfoo()。我有另一个dll称为“B.dll”,它使用A.lib并使用函数foo(),还导出一些其他函数。是否可以从B.dll导出函数int foo()(从A.lib导入),以便在第三个dll(如“C.dll”)中使用 我想知道这是否可行,我不想让C.dll使用A.lib这样的变通方法。此外,我不关心这是否是一个糟糕的设计 非常感谢您耐心阅读。是的,这是可能的,但任何代码示例都依赖于语言。 (例如,在C中,您可以简单地导出具有相同名称的函数

我有一个静态库,称为“a.lib”,它包含一个函数
intfoo()
。我有另一个dll称为“B.dll”,它使用A.lib并使用函数
foo()
,还导出一些其他函数。是否可以从B.dll导出函数
int foo()
(从A.lib导入),以便在第三个dll(如“C.dll”)中使用

我想知道这是否可行,我不想让C.dll使用A.lib这样的变通方法。此外,我不关心这是否是一个糟糕的设计


非常感谢您耐心阅读。

是的,这是可能的,但任何代码示例都依赖于语言。
(例如,在C中,您可以简单地导出具有相同名称的函数,C.dll将看到它)

我有相同的要求-只是找到了不同的解决方案:

假设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
查看它)。在我的例子中,代码<代码>()/Cuth>使用了 .cDECL 调用约定,但是如果使用或编译为C++,则会得到不同的名称修饰,因此,您将不得不调整上面的<代码> 如果A.h被B.dll中的许多源文件包含,这无关紧要——如果多次创建完全相同的定义,链接器不会抱怨


这种方法的一个“优点”是,您甚至不必在A.lib中的
foo()
上使用
\uu declspec(dllexport)
说明符…

我想我对我的问题有点含糊不清。更具体地说,这是可能的,在Windows使用VisualStudioC++?因为正如我所见,我无法这样做-在C.dll中,我可以看到使用B.dll本身导出的符号,但我无法访问foo,尽管我已在B.dll中将其声明为导出符号。
令人惊讶的是,当我在B.dll上执行转储时,我甚至可以看到符号foo<谢谢你的及时回复
更新:如果我使A.lib成为动态的,即创建A.dll而不是A.lib,那么B.dll的dumpbin不包含对foo()的引用。我想名称冲突可能会使编译器有点困惑,对于具有相同原型的函数,您有u declspec(导出)和u declspec(导入)。我想,如果你不能将依赖项从C添加到a,那么你必须更改函数名。我不确定我是否遵循这一点-更改a.lib中的函数名??此外,我还要再次强调,函数foo在B.dll的dumpbin中不可见。我理解,但在B.dll中,您有一些类似于:void u declspec(export)foo();和void uu declspec(import)foo();那么,正确的方法是什么呢?从技术上讲,在这种情况下,我不需要dllimport,因为我正在链接到一个静态库。我所需要的只是从B.dll导入foo的dllexport。顺便说一句,我可以通过在代码(在B.dll中)中获取foo的地址成功地使foo出现在B.dll的dumpbin中-我认为编译器是在B.dll中内联foo。使用.def文件显式声明导出会产生最少的混乱。