2016-10-27 7 views
1

私は同じ名前の218KB .dllと596KB .soファイルを持っています。私は.dllにリンクして、リンカが返す "未解決の外部シンボル"エラーを回避しますが、DLLファイルにリンクする方法を見つけることができません。Pelles CのDLLへのリンク

this Pelles C forum topicによると、.defファイルを使用して.libを作成する必要がありますが、.defファイルはありません。 This forum topicpolinkを使用してコマンドラインから.libを作成する方法を示していますので、いくつかのオプションを得るためにpolink /?を実行しました。 /MAKEDEFオプションに気づきましたが、.dll.soの両方でこれを実行すると、 "No library file specified"という致命的なエラーが発生します。

私はこれを3時間行っていますが、アイデアがありません。私は私のウェブ検索が自分のヘルプリクエストを上回るようになっています。これを行う方法が必要です... .dllにリンクするにはどうすればよいですか?

+0

を、あなた少なくともどの機能がエクスポートされているかを知る必要があります(外部ソフトウェアによって使用される)。しかし、.dllから.libまたは.defを生成することができても、エクスポートされたすべての関数が完全に記述されている定義ヘッダーなしで.dllを使用することはできません(名前、パラメーターの型、結果の型...と呼び出し規約)では、.dllを使用することはできません。 –

+0

@ J.Piquard私はヘッダーファイルを持っています。それはうまく動作しないリンカです。 – wizzwizz4

+0

cソースコードをコンパイルするときに、このヘッダを追加しましたか?もしそうなら、あなたはどのような「解決されていない外部のシンボル」を手に入れましたか? –

答えて

1

ヘッダー#includeの情報と詳細を使用して、欠落している機能をソフトウェアから動的に呼び出すことで置き換える方法があります。 1 - 次のプロトタイプは、#includeである:

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

2 - 必要に応じて、あなたが埋めることができ、いくつかのconst:

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

In order to confirm the sXPLMRegisterFlightLoopCallbackName , you can use the freeware Dependency Walker and check name and format of the exported functions.

、3-外部関数のプロトタイプを宣言します。

Be aware to the calling convention __cdecl or __stdcall

In the current case, the keyword XPLM_API is defined in the XPLMDefs.h as follow:

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

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

、4- CL

#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-ちょうどあなたの説明の呼び出しを追加:お使いのソフトウェアでそれを呼び出すための一つの機能あなたはどちらの.lib(インポート・ライブラリー)も.defファイル(エクスポート定義)を持っている場合

... 
XPLMRegisterFlightLoopCallback(callbackfunction, 0, NULL); 
... 
+0

DLLが*別のDLL *からロードされていた場合、これは動作しますか? – wizzwizz4

+0

LoadLibraryを使用しても、DLLがまだ別のDLLからロードされているかどうかはチェックされません。その他のDLLについていくつかの詳細を追加できますか?あなたは同じソフトウェアでそれを使いましたか? –

+0

私のコメントがどれほどあいまいであるかが分かりました。私はDLLであるプラグインを作成しています。同じプログラムによってインポートされた他のDLLプラグインがあるかもしれません。ドキュメントには、DLLに直接リンクするのではなく、DLLにリンクすると書かれているので、その場合でも動作するかどうかを尋ねていました。 – wizzwizz4

関連する問題