2011-06-26 11 views
11

MDdの代わりにVisual Studio 2010でMTdを使用してコンパイルしようとしています(DLLがパッケージ化されているので、それらを私のexeで配布してください)、コンパイル中に "致命的なエラーLNK1169:1つ以上の複数定義されたシンボルが見つかりました。" MDdは正常にコンパイルされますが、他のコンピュータのMSVCP100.dllがなければ動作しません。Visual Studio 2010でMDとは異なり、MTモードで単純なQtプログラムをコンパイルできない

私は静的なQtビルドを使用していますが、VSアドインに付属するデフォルトのQtプログラムをビルドしようとしています。

リンカーを静的にコンパイルする別の方法はありますか?私がしようとしているのは、DLLなしでexeとしてQtプログラムを配布することだけです。ここで

は、ビルドログです:

1>ClCompile: 
1> All outputs are up-to-date. 
1> cooltest1.cpp 
1> moc_cooltest1.cpp 
1> main.cpp 
1> Generating Code... 
1> All outputs are up-to-date. 
1> qrc_cooltest1.cpp 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: __thiscall std::exception::exception(char const * const &)" ([email protected]@@[email protected]@Z) already defined in LIBCMT.lib(stdexcpt.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: virtual __thiscall std::exception::~exception(void)" ([email protected]@@[email protected]) already defined in LIBCMT.lib(stdexcpt.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: __thiscall std::exception::exception(class std::exception const &)" ([email protected]@@[email protected]@@Z) already defined in LIBCMT.lib(stdexcpt.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _memmove already defined in LIBCMT.lib(memmove.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _strncmp already defined in LIBCMT.lib(strncmp.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _isupper already defined in LIBCMT.lib(_ctype.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _isalpha already defined in LIBCMT.lib(_ctype.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _isdigit already defined in LIBCMT.lib(_ctype.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _isspace already defined in LIBCMT.lib(_ctype.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: __control87 already defined in LIBCMT.lib(_ieee87_.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: __clearfp already defined in LIBCMT.lib(_ieee87_.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _strncpy_s already defined in LIBCMT.lib(strncpy_s.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _strcpy_s already defined in LIBCMT.lib(strcpy_s.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: __thiscall std::exception::exception(char const * const &,int)" ([email protected]@@[email protected]@Z) already defined in LIBCMT.lib(stdexcpt.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _exit already defined in LIBCMT.lib(crt0dat.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: __errno already defined in LIBCMT.lib(dosmap.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _abort already defined in LIBCMT.lib(abort.obj) 
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" ([email protected]@[email protected]@@Z) already defined in LIBCMT.lib(typinfo.obj) 
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" ([email protected]@[email protected]@@Z) already defined in LIBCMT.lib(typinfo.obj) 
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library 
1>c:\users\username\documents\visual studio 2010\Projects\CoolTest1\\CoolTest1.exe : fatal error LNK1169: one or more multiply defined symbols found 
1> 
1>Build FAILED.  
+0

を再構築し、私は数年前ということでしたが、私は最終的にそれがトラブルの価値がないと判断しました。 Qtの人々はあなたが動的に構築することを望んでいます。そうすればあなたの人生はより簡単になります。 – user763305

答えて

14

これは、あなたが/ MTをいじくり標準リンカエラーです。/MTでコンパイルされたコードをリンクしているので、/ MDでコンパイルされたコードでlibcmt.libのCRTコードに依存し、msvcrt.libのCRTコードに依存しています。これは許可されていません。あなたのプログラムにリンクされているCRTは1つだけです。

まだ/ MDでコンパイルされているコードを見つける必要があります。このコードは、QTのランタイムサポートコードのように.libに存在する可能性があります。 QTに静的にCRTのリンクをサポートする.libがない場合、/ MDがついています。これは珍しいことではないが、/ MTを扱うことができるDLLに存在するコードを書くのは難しい。

2

プログラムを静的にリンクしていて、libcmtとリンクしていますが、Qt DLLのコードをリンクしています。これは既に名前が示すとおり、動的にmsvcrt.libとリンクしています。

Qtをソースから静的にリンクする必要があります。これは難しくありませんが、時間がかかります。

10

スタティックVCライブラリを使用するようにQTを再構築することができます。 ${QtDir}\mkspecs\win32-msvc2010\qmake.confに移動し、そのクリーンな再構成した後

QMAKE_CFLAGS_RELEASE = -O2 -MT 
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi 
QMAKE_CFLAGS_DEBUG  = -Zi -MTd 

QMAKE_CFLAGS_RELEASE = -O2 -MD 
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi 
QMAKE_CFLAGS_DEBUG  = -Zi -MDd 

を交換し、QT

+0

ありがとう、本当に素敵な発見! – Listing

+0

これは私にとってはうまくいかず、Qtは-MDで構築されています!なぜ?? –

+0

適切なビジュアルスタジオを使用していますか? Qtは異なるvsバージョンの別々のパスを持っています – Raiv

関連する問題