首页 > 解决方案 > 将库 (DLL) 显式加载到旧版函数指针中

问题描述

我会尽量具体。

我需要在运行时将 PythonXX.dll 显式加载到我的例程中。我使用名义描述 (Python.h) 来描述函数。问题是链接器抱怨这些例程不存在。我无法更改函数定义以使链接器满意,因为 Python #include 代码结构分散。

在这一点上,我的想法是创建存根例程,该例程调用要在运行时加载 .dll 时加载的函数指针。存根使链接器感到满意,并且在运行时加载 .dll 时它们可以正确运行。但这也有一些问题。[有些函数是其他例程的#defines,varags难以重定向等]

有一个更好的方法吗?我不敢相信这以前没有发生过。如果有任何不清楚的地方,我将编辑并清理问题以澄清。

更新:好的,这似乎可行,至少在某些例程中是这样。(幸运的是,我只需要使用 .dll 的 1000 多个函数中的大约 20 个)

示例函数指针定义:

int (__cdecl *pPy_IsInitialized)(void);

一个示例存根:

int Py_IsInitialized()
{
  return pPy_IsInitialized();
}

一个示例分配(dll 从 LoadLibrary() 返回):

pPy_IsInitialized = (void *)GetProcAddress(dll,"Py_IsInitialized");

标签: windowsdlldynamic-linking

解决方案


您最好的选择是使用延迟加载的 DLL。此功能会延迟 DLL 的加载(PythonXX.dll在您的情况下),直到调用它的任何函数。您可以通过延迟加载辅助函数自定义实际的库加载(例如从特定位置加载)。

作为旁注,您在问题中提出的解决方案非常有意义并且易于自动化。延迟加载的 DLLS 为 Windows 实现了它,而我的Implib.so为 Linux 共享库实现了相同的功能。


推荐阅读