11

複数のプロジェクトで解決策があります。メニューとして機能する「メイン」プロジェクトがあり、そこからユーザーは他のプロジェクトにアクセスできます。このメインプロジェクトでは、呼び出されたすべての関数でリンカーエラーが発生します。これらのリンカーエラーを回避するにはどうすればよいですか?「プロジェクトの依存関係...」ダイアログですでにプロジェクトの依存関係を設定しました。

ありがとう

編集-提案どおりに実行し、出力フォルダーをリンカーの追加ディレクトリに追加しました。しかし今、私は次のように百万のエラーを受け取ります:

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in panels.lib(panel_main.obj)
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (?facet_Register@facet@locale@std@@CAXPAV123@@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
4

9 に答える 9

20

ソリューションに関するすべての詳細を知らずに答えるのは難しいですが、「他の」プロジェクトが .lib ファイルを生成するように設定されており、メイン プロジェクトがこれらすべての lib ファイルをリンクしていると仮定します。その場合、発生しているエラーの考えられる原因は、プロジェクトが異なるバージョンのランタイム ライブラリにリンクしていることです。

Microsoft のドキュメントから、「リンカーの特定の呼び出しに渡されるすべてのモジュールは、同じランタイム ライブラリ コンパイラ オプション (/MD、/MT、/LD) でコンパイルされている必要があります。」

すべてのプロジェクトが同じバージョンのランタイム ライブラリを使用するように変更してみてください。Visual Studio 2010 では、これはプロジェクトの [プロパティ] | 構成プロパティ | C/C++ | コード生成 | ランタイムライブラリ。[マルチスレッド デバッグ DLL ]または[マルチスレッド デバッグ] (デバッグ構成用) のいずれかを選択します。

于 2009-03-03T10:32:23.097 に答える
11

ソリューションに関する他の詳細を知らなければ、わかりにくいですが、[すべて再構築]が役立つ場合があります。この状況は、異なるアーキテクチャのオブジェクトファイルが混在している場合に発生することがあります。

「依存関係」の代わりに「参照」の使用を検討することもできます

編集:

あなたが投稿したものの後、標準ライブラリへのリンクに一貫性がないようです。プロジェクトの1つが標準ライブラリを静的にリンクし、他のプロジェクトが動的にリンクしている可能性がありますか?(プロジェクトのプロパティ->リンカーを参照)または1つはリリースランタイムに、他の1つはデバッグしますか?(ただし、最後の1つは可能であるはずですが、注意が必要です)

于 2009-03-02T23:32:28.300 に答える
2

他のプロジェクトの関数はエクスポートされていますか? それらがエクスポートされていない場合、メインのexeからリンクするものがないため、エラーが発生します。詳細については、__declspec(export)を使用した DLL からのエクスポートを参照してください。

于 2009-03-02T23:44:38.847 に答える
1

表示されるエラーは、リンクしているライブラリ (msvcprtd.lib) のシンボルが別のライブラリ (panels.lib など) で既に定義されている「エラー LNK2005」です。panel.lib を「特定のライブラリを無視する」フィールド (VS2008 構成プロパティ --> リンカー --> 入力 --> 特定のライブラリを無視) に追加すると、エラーは停止します。

于 2010-04-01T01:57:22.357 に答える
0

発生しているリンカーエラーは「未解決のシンボル」によるものだと思いますか?

静的ライブラリ(つまり、.libファイル)を使用する場合は、リンカ入力にライブラリを追加して、リンク時にシンボルをリンクできるようにする必要があります。これを行わないと、未解決のシンボルが表示されます。

  1. プロジェクトを右クリックして、[プロパティ]を選択します。
  2. [構成プロパティ]->[リンカー]->[入力]を選択します
  3. [追加の依存関係]の下にライブラリ名(例:filename.lib)を入力します。
于 2009-03-02T23:33:36.893 に答える
0

正確には、プロジェクトの少なくとも 1 つが、他のプロジェクトとは異なる「ランタイム ライブラリ」でコンパイルされています。異なるデフォルトを使用して新しいものを追加した可能性があります。プロジェクトのプロパティをチェックして、"構成プロパティ" -> "C/C++" -> "コード生成" -> "ランタイム ライブラリ" の値が等しいかどうかを確認します。

于 2012-12-06T10:52:57.683 に答える
0

これと非常によく似た問題がありましたが、これは、ライブラリの 1 つに「wchar_t を組み込み型として扱う」オプションが他のライブラリとは異なる値に設定されていたためです。この設定は、新しいプロジェクトではデフォルトで false です。それらをすべてtrueに変更すると、問題が修正されました。

于 2011-05-12T12:33:00.717 に答える
0

私の場合、問題は、関数プロトタイプ、クラス定義、および関数実装とクラス実装を 1 つの cpp ファイルに保持していたためでした。宣言とプロトタイプを別のヘッダー ファイルに移動して初めて、これらのエラーが消えました。本当に奇妙です!

于 2013-03-01T03:35:34.207 に答える