1

我正在尝试使用 MSVC 6(复古!)在 Windows 上构建一个共享库(DLL),我有一个特殊的链接问题需要解决。我的共享库必须访问一些全局状态,由加载应用程序控制。

概括地说,我所拥有的是:

应用程序.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 的情况下这样做;我们的自动化构建基础架构使用 makefile 驱动 MSVC。如果我省略了一些可以更容易回答问题的内容,请发表评论,我会尽快更新。

4

3 回答 3

2

这实际上是很难开始工作的。在 Unix/Linux 上,您可以让共享对象和应用程序相互导入符号,但在 Windows 上,您不能让 DLL 从加载它的应用程序中导入符号:Windows PE 可执行格式不支持该惯用语。

我知道 Cygwin 项目有某种解决方法来解决这个问题,但我不认为这是微不足道的。除非你想做很多与 PE 相关的黑客活动,否则你可能不想去那里。

一个更简单的解决方案可能是从 DLL 导出某种初始化方法:

typedef int (*func_ptr)();
void init_library(func_ptr func);

应用程序必须在启动时调用它,并传入您要共享的函数的地址。不完全优雅,但它应该可以正常工作。

于 2008-10-29T17:22:44.883 回答
1

后半部分你需要从你的 application.c 中导出函数。您可以在链接器中执行此操作:

/export:use_private_value@0

这应该会为您提供一个使用 DLL 构建的 lib 文件。

链接 lib 文件的选项是使用 GetProcAddress()。

正如 DavidK 所指出的,如果您只有几个函数,那么在 init 函数中传递函数指针可能会更容易。但是,可以按照您的要求进行操作。

于 2008-10-29T17:30:32.043 回答
1

我将从一半的答案开始。

在 shared_library.c 中:

__declspec(dllexport) int __stdcall shared_library_method(void)
{


}

关于从 DLL:s 导出函数的MSDN 文章。

于 2008-10-29T16:59:46.757 回答