2

開始点: ws2_32.lib にリンクするサード パーティの静的ライブラリにリンクする C++ コードがいくつかあります。

目標: この C++ コードを、基本的に Win32 プラットフォームである組み込みプラットフォームに移植する方法を調査しています。ただし、DLL は許可されておらず、独自の UDP プロトコルが実装されています。

戦略: winsock API (または少なくとも私が関心のあるこの API のサブセット) を模倣する静的ライブラリを作成したいと考えています。これらの関連する winsock 関数は、組み込みプラットフォームでサポートされている独自の UDP 関数呼び出しへのラッパーとして機能します。

前提: ws2_32.lib ではなく、この静的ライブラリを最終的な実行可能ファイルにリンクできます。

質問:

  1. 私の仮定は正しい/合理的ですか?
  2. リンクを機械的に設定するにはどうすればよいですか?

私がやったこと: 私は 1 つの機能だけでそうしようとしましたが、リンクできないようです。これは、静的ライブラリで定義したものです。

unsigned short __stdcall htons(unsigned short hostshort) {
    return hostshort;
}

リンクすると、次のエラーが表示されます。

: error LNK2001: unresolved external symbol __imp__htons@4

リンク メッセージのこの__imp__接頭辞は、私にはよくわかりません。dll で定義されている関数の名前は特別な方法で変更されますか? スタティック ライブラリでこれを偽造して、リンカに ws2_32.lib の関数ではなく、自分のバージョンの関数とリンクさせることはできますか?

どんな助けでも大歓迎です。

4

2 に答える 2

1

Winsock を独自のネットワーク スタックに置き換えるという道をたどりたくはありません。

ただし、 のような単純なルーチンをモックするだけでよい場合は、それで問題ありませんhtons

ルーチンを としてマークする必要がextern "C"あり、おそらくそれらをエクスポート済みとしてマークする必要があります。

extern "C" 
{
__declspec(dllexport) 
unsigned short __stdcall htons(unsigned short a) { return a; }
}

それらを C 互換の extern としてマークしない場合、リンカーは何らかの名前マングリングを行います。

于 2013-03-11T05:22:47.717 に答える
0

プレフィックスは、DLL関数への__imp__トランポリン(末尾呼び出し)であることを示します。これにより、ライブラリのロードおよび修正中にライブラリ関数の実際のアドレスを変更する必要がある場所が1つしかないため、ダイナミックリンクが効率的になります。__declspec(dllimport)関数宣言でヘッダーファイルが使用されているため、コンパイラはそれを探します。

dllimportfromを(おそらくマクロを介して)削除するか、プレフィックスwinsock2.hを使用して実装を定義することができます。_imp__

于 2013-03-11T05:08:35.987 に答える