6

DLL としてコンパイルしたい VS2008 ネイティブ C++ プロジェクトがあります。

1 つの外部ライブラリ (log4cplus.lib) のみを参照し、その関数を使用します。(もちろんlog4cplusの.hファイルも使用します)。

プロジェクトを静的ライブラリとしてコンパイルしようとすると、成功します。DLL として実行しようとすると、失敗します。

1>MessageWriter.obj : error LNK2019: unresolved external symbol "public: static class log4cplus::Logger __cdecl log4cplus::Logger::getInstance(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" (?getInstance@Logger@log4cplus@@SA?AV12@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z) referenced in function "class log4cplus::Logger __cdecl Log(void)" (?Log@@YA?AVLogger@log4cplus@@XZ)

log4cplus.lib 内の関数に関連して、このようなエラーがさらに 4 つあります。

それは本当にばかげているようです..私を助けてください:)

ありがとう!

編集 :

私は log4cplus.lib ファイルに対してリンクされていますが、それは問題ありません。また、log4cplus.lib は 100% 機能しており、別のプロジェクトで問題なく使用しています。私の当初の意図は、プロジェクトを静的ライブラリとしてコンパイルし、それを作成中の別の DLL で使用することでしたが、これを行うと、他のプロジェクトで同じリンカ エラーが発生します...

編集#2:

リンカ エラーの原因となる関数は静的関数です。これが問題の一部である可能性はありますか?

4

7 に答える 7

6

ウィルクスは正しい.私は同じリンクの問題を抱えています.

この問題を解決するのにほぼ 1 日かかりました。

このプロジェクトを Visual Studio 2010 で開いた後、log4cplus-1.0.4 をダウンロードし、静的ライブラリと動的ライブラリの両方をコンパイルします。エラーはありません。

ただし、これらのライブラリを使用しようとすると、静的ライブラリまたは動的ライブラリに関係なく、リンクエラーが発生しました。

その理由は、これらのプロジェクトはデフォルトでマルチバイト文字を使用するためですが、私のプロジェクトはユニコードを使用しているため、これらのリンクの問題を解決するには、1 つのプロジェクトの文字セットを変更するだけで済みます。

ユニコードまたはマルチバイト文字セットの両方。

Visual Studio 2010 で 1 つのプロジェクトの文字セットを変更するには、次のリンクを参照してください。

VC++ プロジェクトで Unicode をオフにするにはどうすればよいですか?

于 2011-06-24T05:04:56.570 に答える
4

静的ライブラリを作成する場合、ライブラリの作成者は、使用しているすべての関数 (log2cplus.lib にある関数) を解決しようとはしません。これらの関数は、静的ライブラリにリンクする実行可能ファイルを作成すると解決されます。

動的ライブラリを作成する場合、ライブラリの作成者 (リンカー) は、使用しているすべての関数を解決しようとします。動的ライブラリをビルドしたらすぐに、リンカーに log4cplus.lib ライブラリを提供する必要があります。実行可能ファイルを作成するまで待つことはできません。

于 2010-05-17T11:28:15.797 に答える
3

どちらの場合も、ライブラリにリンクする必要があります。

違いは、静的にリンクすると、使用しているライブラリを介してすべての機能がリンクされることです。

動的にリンクしている場合、dll から関数を読み込んで使用する機能を持つインポート ライブラリにリンクしますが、この手順が欠落しています。通常、インポート ライブラリは、リンク先の dll と同じ名前です。

編集:

行方不明のシンボルが '__imp...' ではないことがわかりました。これは、ヘッダー ファイルが動的リンケージ用に「構成」されていないことを意味します。おそらく、Log4Cplus ヘッダーを含めるプロジェクトで定義されているLOG4CPLUS_BUILD_DLLか定義されていlog4cplus_EXPORTSないためです。DLL_EXPORT

于 2010-05-17T11:33:44.380 に答える
2

実際に log2cplus.lib ファイルとリンクしていますか? 静的ライブラリとしてコンパイルしている場合は、静的ライブラリではなく、最終的な .exe を介してリンクします - おそらくそれが違いでしょうか?

于 2010-05-17T11:27:17.950 に答える
0

リンカーエラーについては、次の2つの可能性があります。

  1. 提供されたリリースビルド構成を使用してlog4cplus.dll(および関連するlog4cplus.libインポートライブラリ)をコンパイルしましたが、アプリケーションは「文字セット」オプションを「Unicode文字セットを使用」に設定してコンパイルされています。

  2. または、log4cplusの静的ライブラリを使用しようとしていますが、アプリケーションにLOG4CPLUS_BUILD_DLLを定義しています。

私は1番に賭けます。それでも、それは何か他のものである可能性があります。どのバージョンのlog4cplusを使用していますか?

アプリケーションでlog4cplus.dllを使用する場合は、LOG4CPLUS_BUILD_DLLシンボルを定義します。log4cplus_EXPORTSとDLL_EXPORTは、それぞれMingGWでCMakeベースのビルドシステムとautotoolsベースのビルドシステムをサポートするためだけにあります。

于 2010-05-18T09:05:19.287 に答える
0

__declspec(dllimport) と __declspec(dllexport) を使用しましたか?

静的ライブラリをリンクする場合は必要ありませんが、DLL には必要です。関数はエクスポート用に (DLL 内で) 宣言する必要があるため、ユーザーは関数を外部で使用できます (したがって、DLL からインポートできます)。

多分これは助けることができます:

__declspec(dllimport) を使用したアプリケーションへのインポート

http://msdn.microsoft.com/en-us/library/8fskxacy%28VS.80%29.aspx

よろしくお願いします

于 2010-05-17T11:28:26.700 に答える
0

MSVC などのコンパイラを使用している場合、lib から dll に変更するときに、知らないうちにプロジェクトの設定が変更されている可能性があります。DLL モードで、lib に適切にリンクされていることを再確認する必要があります。

于 2010-05-17T11:31:44.867 に答える