2

I need to write a c++ program using an DLL. I have the DLL and a header file, but no .a file for the linker. The GNU GCC Compiler cannot find the functions in the DLL file.

I’m getting errors like:

    undefined reference to _imp__mbnEthernetOpen@8

How do I fix this problem.

4

2 に答える 2

3

別の共有ライブラリに依存するプログラムをコンパイルしようとしているようです。Windows でこのライブラリをサポートするようにコンパイルするには、通常、次の 3 つが必要です。

  • ヘッダファイル
  • コンパイル時リンク用の lib バイナリ
  • ランタイム実行に使用される dll バイナリ (実行時に検出およびロードされるバイナリのパスにある必要があります) .lib ファイルを静的にリンクする場合はオプション

あなたのコメントでは、ヘッダー ファイルと dll ファイルしかないと言っています。これは、lib バイナリが見つからず、ライブラリを検索/再コンパイルする必要があるか、実行時に DLL を動的にロードし、関数ポインターを使用してさまざまな関数を呼び出そうとしていることを意味します (Goksel が彼の回答で言及しているように)。エラーは、最初のオプション (共有ライブラリへのリンク) を実行しようとしていることを示しています。

コンパイル時にライブラリに動的にリンクする場合は、lib ファイルが必要です。

于 2013-08-26T15:54:44.447 に答える
1

最後に WinAPI を使用してからかなり時間が経ちましたが、記憶が正しければ、 または のいずれかを使用して実行時にライブラリを動的にロードする必要がありLoadLibraryますLoadLibraryEx。その後、使用したい特定の関数のアドレスを取得する必要がありますGetProcAddress。あなたの場合、これはmbnEthernetOpen(私が推測する)でしょう。

この面倒な作業の後、ようやくmbnEthernetOpenDLL から取得したばかりの関数ポインターを介して呼び出すことができます。

編集:コメントを読んだ後、.libファイルを生成する方法を含むように回答を拡張することにしました。

まず、VLCwikiには、そのプロセスを徹底的に追った非常によく書かれた記事があります。ただし、わかりやすくするために、ここで繰り返します。

  1. [スタート] メニューからVisual Studio Command Promptを見つけて実行します。wiki によると、これはMicrosoft Visual Studioエントリの下にあるはずです。

  2. Visual Studioのコマンド プロンプトで、次のコマンドラインを実行して DLL ファイルからシンボルを抽出します。 と をそれぞれ正しい入力ファイルと出力ファイルへのパスにdumpbin /exports input.dll > exports.def置き換えてくださいinput.dllexports.def

    この時点で、テキスト エディターを起動し、新しく生成され.defたファイルを次のように編集できます。

    EXPORTS
    libvlc_add_intf
    libvlc_audio_get_channel
    libvlc_audio_get_mute
    libvlc_audio_get_track
    libvlc_audio_get_track_count
    libvlc_audio_get_track_description
    libvlc_audio_get_volume
    …
    

    明らかに、エクスポートされたシンボルの名前は、DLL によって異なります。

    .defただし、何らかの理由でこれらすべてを手動で行いたくない場合は、VLC wiki で記事を書いたクールな人たちが、ファイルを自動的に生成するワンショット コマンドラインを思い付きました。

    echo EXPORTS > output.def
    for /f "usebackq tokens=4,* delims=_ " %i in (`dumpbin /exports input.dll`) do if %i==tag echo %i_%j >> exports.def
    

    tagここでも、一時的な名前を修正された同等のものに置き換えてください。さらに、その記号に注意してください。VLC の例ではlibvlc、これは でした。例では、エクスポートされた各シンボルの最初の部分です。さて、あなたは単一の関数を示したので、これがどうあるべきかわかりませんが、エクスポートされたシンボルを見て理解できると確信しています.

  3. 最後に、.libファイルにあるこれらのエクスポートされたシンボルからファイルを生成し.defます。 lib /def:exports.def /out:library.lib /machine:x86

    /machineプラットフォームによって異なる場合があることに注意してください。

ほらね。これは、.libファイルからファイルを生成する方法です.dll

于 2013-08-26T15:00:29.610 に答える