我试图在Windows上使用MSVC 6(retro!)构build一个共享库(DLL),我有一个特殊的链接问题,我需要解决。 我的共享库必须访问一些全局状态,由加载应用程序控制。
大体上,我拥有的是这样的:
application.c:
static int g_private_value; int use_private_value() { /* do something with g_private_value */ } int main (...) { return shared_library_method (); }
shared_library.c:
__declspec(dllexport) int __stdcall shared_library_method() { use_private_value(); }
( 更新 – 我忘记了__declspec(dllexport) int __stdcall
部分,但它在真正的代码中)
如何设置shared_library.dll,以便导出shared_library_method
并导入use_private_value
?
请记住,A)我是一个unix程序员,一般来说,B),我没有Visual Studio做这个; 我们的自动构build基础设施使用makefiles驱动MSVC。 如果我省略了一些可以更容易回答的问题,请发表评论,我会尽快更新。
实际上这将是相当困难的工作。 在Unix / Linux上,您可以共享对象和应用程序相互导入符号,但在Windows上,您不能从加载它的应用程序中获得DLL导入符号:Windows PE可执行文件格式不支持该方法。
我知道Cygwin项目有一些解决这个问题的方法,但我不相信这是微不足道的。 除非你想做很多与PE有关的黑客攻击,否则你可能不想去那里。
一个简单的解决方案可能只是从DLL中导出某种初始化方法:
typedef int (*func_ptr)(); void init_library(func_ptr func);
应用程序必须在启动时调用此函数,并传入要共享的函数的地址。 不完全优雅,但它应该工作正常。
我将从一半的答案开始。
在shared_library.c中:
__declspec(dllexport) int __stdcall shared_library_method(void) { }
有关从DLL导出函数的MSDN文章 :s。
下半年,您需要从您的application.c中导出函数。 你可以在链接器中做到这一点:
/export:use_private_value@0
这应该得到一个你用你的DLL构建的lib文件。
链接lib文件的选项是使用GetProcAddress()。
正如DavidK指出,如果你只有一些函数,那么在init函数中传递函数指针可能会更容易一些。 然而,有可能做你所要求的。