链接到Pelles C中的DLL
我有一个218KB .dll
和一个596KB .so
文件,两个名字相同。 我想链接到.dll
以避免链接器返回的“未解析的外部符号”错误,但我找不到链接到DLL文件的方法。
根据Pelles C论坛主题 ,我需要使用.def
文件来创建.lib
…但是我没有.def
文件。 这个论坛主题展示了如何使用polink
创建.lib
,所以我运行了polink /?
获得更多选择。 我注意到了一个/MAKEDEF
选项,但是使用.dll
和.so
运行它会给出“没有指定库文件”的致命错误。
我一直试图这样做三个小时,而且我没有想法。 我已经到了我的网络搜索发出我自己的帮助请求的程度。 必须有办法做到这一点……我怎样才能链接到.dll
?
通过标题#include和您的详细信息中的信息,可以通过从软件中动态调用它们来替换丢失的函数。 1-以下原型在#include中:
typedef float (* XPLMFlightLoop_f)(float inElapsedSinceLastCall, float inElapsedTimeSinceLastFlightLoop, int inCounter, void * inRefcon);
2-你可以根据需要填写的一些const:
const char *sDllPathName = ".dll"; const char *sXPLMRegisterFlightLoopCallbackName = "XPLMRegisterFlightLoopCallback";
为了确认
sXPLMRegisterFlightLoopCallbackName
,您可以使用免费软件Dependency Walker并检查导出函数的名称和格式。
3-声明外部函数的原型:
请注意调用约定
__cdecl
或__stdcall
在当前情况下,关键字
XPLM_API
在XPLM_API
中定义如下:
#define XPLM_API __declspec(dllexport) // meaning __cdecl calling convention typedef void (__cdecl *XPLMRegisterFlightLoopCallback_PROC)(XPLMFlightLoop_f, float, void *);
4-克隆函数以在软件中调用它:
#include 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); ...