e.g。在一个静态库中我有
void function (void);
function();
主要应用程序中存在function()。
但是,如果我将其构建为DLL,则链接器会抱怨DLL上的函数未定义。
答案 0 :(得分:3)
是的,但这很黑。
在dll中:
typedef void(*funcPtr)(void);
// Declare a variable named "ptrFunction" which is a pointer to a function which takes void as parameter and returns void
funcPtr ptrFunction;
// setter for ptrFunction; will be called from the .exe
void DLL_EXPORT setFunction(funcPtr f){ptrFunction f;}
// You can now use function() through ptrFunction
foo(){
ptrFunction();
}
然后从.exe调用setFunction。
void function(){
// implementation here
}
int main(){
setFunction(&function); // now the dll knows the adress of function()
foo(); // calls foo() in dll, which calls function() in the .exe
....
}
太好了,对吧? :/ 你可能应该重构你的代码,以便function()在另一个DLL中,但它取决于。
答案 1 :(得分:2)
是的,你可以,但如果你不需要,我强烈建议不要这样做。它很繁琐,感觉你需要更好地理清你的依赖关系。
要做到这一点,在实际链接之前,必须使用LIB.EXE
从一个二进制文件的目标文件中创建一个导入库;使用此导入库链接其他二进制文件并为其他二进制文件创建导入库;最后使用其他库的导入库链接原始二进制文件。
E.g。
exe.c:
#include <stdio.h>
void __declspec(dllimport) dllfn(void);
void __declspec(dllexport) exefn(void)
{
puts("Hello, world!");
}
int main(void)
{
dllfn();
return 0;
}
编译器cl /c exe.c
。 exe.obj
已创建。
exe.def:
LIBRARY exe.exe
使用lib /def:exe.def exe.obj
创建导入库。 exe.lib
和exe.exp
已创建。
dll.c:
void __declspec(dllimport) exefn(void);
void __declspec(dllexport) dllfn(void)
{
exefn();
}
与cl /c dll.c
汇编。 dll.obj
已创建。
将DLL链接到link /dll dll.obj exe.lib
。 <{1}},dll.dll
和dll.lib
已创建。
将EXE与dll.exp
相关联。 link exe.obj dll.lib
已创建。 (exe.exe
和exe.lib
也会重新创建。)
运行exe,请注意exe.exp
输出。