1

我有一个 218KB.dll和一个 596KB 的.so文件,它们的名称相同。我想链接到.dll以避免链接器返回的“未解析的外部符号”错误,但我找不到链接到 DLL 文件的方法。

根据this Pelles C forum topic,我需要使用该.def文件来创建一个.lib......但我没有.def文件。这个论坛主题展示了如何使用从命令行polink创建一个,所以我跑去获取更多选项。我注意到了一个选项,但是同时使用和运行它会出现“未指定库文件”致命错误。.libpolink /?/MAKEDEF.dll.so

我一直在尝试这样做三个小时,并且没有想法。我已经到了我的网络搜索出现我自己的帮助请求的地步。必须有办法做到这一点......我怎样才能链接到一个.dll

4

1 回答 1

1

使用标题#include 中的信息和您的详细信息,这是一种通过从您的软件中动态调用它们来替换缺失函数的方法。1-以下原型在 #include 中:

typedef float (* XPLMFlightLoop_f)(float inElapsedSinceLastCall, float inElapsedTimeSinceLastFlightLoop, int inCounter, void * inRefcon);

2-您可以根据需要填写一些常量:

const char *sDllPathName = "<Your XPLM_API DLL>.dll";
const char *sXPLMRegisterFlightLoopCallbackName = "XPLMRegisterFlightLoopCallback";

为了确认sXPLMRegisterFlightLoopCallbackName,您可以使用免费软件Dependency Walker并检查导出函数的名称和格式。

3-声明外部函数的原型:

注意调用约定__cdecl__stdcall

在当前情况下,关键字XPLM_API定义XPLMDefs.h如下:

#define XPLM_API __declspec(dllexport) // meaning __cdecl calling convention

typedef void (__cdecl *XPLMRegisterFlightLoopCallback_PROC)(XPLMFlightLoop_f, float, void *);

4-克隆函数以在您的软件中调用它:

#include <windows.h>

void XPLMRegisterFlightLoopCallback(XPLMFlightLoop_f inFlightLoop, float inInterval, void * inRefcon)
{
    HINSTANCE hInstDLL;
    XPLMRegisterFlightLoopCallback_PROC pMyDynamicProc = NULL;

    // Load your DLL in memory
    hInstDLL = LoadLibrary(sDllPathName);
    if (hInstDLL!=NULL)
    {
        // Search for the XPLM Function
        pMyDynamicProc = (XPLMRegisterFlightLoopCallback_PROC) GetProcAddress(hInstDLL, sXPLMRegisterFlightLoopCallbackName);
        if (pMyDynamicProc != NULL)
        {
            // Call the XPLM Function with the orignal parameter
            (pMyDynamicProc)(inFlightLoop,inInterval,inRefcon);
            return;
        }
    }
    // Do something when DLL is missing or function not found
}

5-只需添加您描述的调用:

...
XPLMRegisterFlightLoopCallback(callbackfunction, 0, NULL);
...
于 2016-10-27T22:03:31.050 回答