3

次のようなファイルがあります。

#include <Shlwapi.h>
...
void SomeFunction()
{
UrlCombineW(...)
}

これは、C++ Builder IDE に別の Delphi コンポーネントをインストールするまで問題なくコンパイルされましたが、未解決の外部が報告されるようになりましUrlCombineWた。このコンポーネントをインストールする前は、上記の呼び出しは問題ありませんでした。

コンポーネントが何らかの方法でこれを上書きしているように見えるので、どこを探すべきかをコンパイラに明示的に伝える必要がありますUrlCombineW。これは からの関数ですShlwapi.dll

コンパイラは文句を言いませんが、リンカにこの関数を探す場所を明示的に伝え、未解決の外部エラーを回避するにはどうすればよいでしょうか?

4

1 に答える 1

4

私のコメントを回答に拡張します。

Shlwapi.libリンカーが関数を見つけるには、リンクする必要があります。(この説明ではいくつかの点が省略されていますが.lib、ライブラリ ファイルである は、静的ライブラリまたはインポートライブラリのいずれかになります。静的ライブラリには、関数自体が含まれています。基本的には、.obj ファイルがまとめられたコレクションです。インポート ライブラリは、関数がX、Y、Z は特定の DLL に含まれています。いずれの方法でも、.lib をリンクすると、必要な関数が得られます。

リンカにファイルにリンクするように指示するには、いくつかの方法があります。

  • #pragma comment(lib, "Filename.lib")どこかの .cpp ファイルで使用します。あなたの場合、これは#pragma comment(lib, "Shlwapi.lib")です。
  • これをプロジェクト オプションに追加すると、リンカー コマンド ラインに追加されます。C++ Builder では、実際に .lib ファイルをプロジェクトに追加することでこれを行います。つまり、プロジェクト マネージャーのプロジェクトにドラッグ アンド ドロップするか、[ファイル] > [プロジェクトに追加] を使用します。

どちらを好むかはあなた次第です。私はローカライズされたものにローカルでリンクする傾向があります。そのため、私のコードでは、使用するユニットは 1 つだけでShlwapi.hあり、実際に使用するユニットは外部から隠されている実装の詳細であり、インターフェイスには表示されません。したがって、そのファイルで#pragma commentは、ヘッダーをインクルードする時点で使用してリンクします。一方、はるかに広く使用されているものがある場合 (最も幅の広い例である kernel32.lib を選択する場合)、それをプロジェクト自体に追加します。(これは例であることに注意してください。実際には、kernel32 に明示的にリンクする必要はありません。リンクは自動的に行われます!)

于 2013-11-12T11:27:02.717 に答える