• ベストアンサー

STL使用時のデバッグ設定

現在C++を使いプログラミングをしています Microsoft Visual Studio 2005を使っているのですが SLTを使用した場合ランタイムライブラリの設定を マルチスレッドデバッグ→マルチスレッドに変更すると エラーが出ることがわかりました。 原因を調べているとSTLを使っているとエラーが出ることまで分かりました。 エラーが出るコードは #include <stdio.h> #include <LIST> using std::list; int main() { list<int> ilist; ilist.push_back(1); return 0; } warning LNK4098: defaultlib 'LIBCMT' は 他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 の警告と共に、 未解決の外部シンボル~が参照されました。 とエラーがでます できればMTでコンパイルが通るようにしたいのですが、良い方法ないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

Debug構成の設定を無理やり デバッグなしの /MTでコンパイルOrリンク使用としているのが要因だと思います ビルド > 構成マネージャ > アクティブソリューションの構成を 『Debug』から『Release』に変更 Debug時に変更したオプション部分を プロジェクト > プロパティから変更して ビルドしましょう Debugモードでコンパイルされたソースにはランタイム側にもいろいろとデバッグに必要な関数があります しかしReleaseモードのランタイムにはデバッグ関連の関数は盛り込まれていません Release/Debugの設定をよく確かめましょう

CTester
質問者

お礼

解決しました! デバッグとリリース時の違いに問題があったんですね。 今後は設定などもより気にかけようと思います。 問題が解決し非常に嬉しいです。ありがとうございました。

その他の回答 (2)

noname#82346
noname#82346
回答No.2

闇雲にプロジェクトオプションをいじっても解決しないことが多いので、時間がかかっても、コンパイラ/リンカのエラーをちゃんと理解して解決していくようにした方がいいですよ。 warning LNK4098: defaultlib 'LIBCMT' ... が出る場合、自分/他人が作ったスタティックリンクライブラリをリンクしていることが多いです。例えばそのライブラリをコンパイルしたときのランタイムライブラリオプションがデバッグRTLなのに、メインのアプリケーションの方はリリースRTLでコンパイルしようとしている、などです。 ちなみに、 #include <stdio.h> #include <LIST> ではなく、 #include <cstdio> #include <list> に変更したら、何か変化ありますか?

CTester
質問者

補足

オプション部分はまだ無知な部分があったりで苦労しています。 変更してみましたが特に変化はありませんでした エラーの内容も追記しておきます エラー 5 fatal error LNK1120: 外部参照 3 が未解決です。 エラー 3 error LNK2019: 未解決の外部シンボル __malloc_dbg が関数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib エラー 4 error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib エラー 2 error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z) で参照されました。 libcpmtd.lib

noname#82346
noname#82346
回答No.1

何か非標準のライブラリをリンクしていませんか? もし心当たりがあれば(そして該当ライブラリのソースをお持ちならば)、それもMTでコンパイルし、MT版をリンクすればリンクが通るようになるかと思います。

CTester
質問者

補足

Visual Studio の設定をすべてリセットして試してみましたが 同じエラーが出ました。 他に原因があるのでしょうか?

関連するQ&A

  • C++STLについての質問です。

    C++STLについての質問です。 Visual C++ 2008 Express Edition を使用してDirectXアプリケーションを 作成しています。 その折、std::listテンプレートを使用する機会があったのですが、このリストを 使用しますと、 リンクしています... LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 libcpmtd.lib(stdthrow.obj) : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z) で参照されました。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __malloc_dbg が関数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 fatal error LNK1120: 外部参照 3 が未解決です。 とのエラーが吐かれます。 ネットで検索すると、ソリューション構成をDebugからReleaseにすれば良いとの記述が ありましたので、実行してみました。しかし、 リンクしています... error LNK2001: 外部シンボル "_D3DXCreateTextureFromFileExW@56" は未解決です。 error LNK2001: 外部シンボル "_D3DXCreateSprite@8" は未解決です。 error LNK2001: 外部シンボル "_D3DXGetImageInfoFromFileW@8" は未解決です。 error LNK2001: 外部シンボル "_Direct3DCreate9@4" は未解決です。 fatal error LNK1120: 外部参照 4 が未解決です とのエラーが吐かれてしまいました。 尚、コード生成モードは、マルチスレッド(/MT)で作成しています。 どなたか、この問題を解決する方法をご存知ないでしょうか? よろしくお願いします。

  • MISTのLAPACKの環境設定ができない

    こんにちは.質問させていただきます. 画像の主成分分析を行いたいと思っており,調べたところMISTというライブラリを用いれば用意にできるそうなので,早速使ってみました. しかし行列演算を行うためのLAPACKというものがうまく環境設定できていないようで,大量のエラーが出て困っています. 手順は下のURLのpdfに従い行っておりました. http://mist.suenaga.cse.nagoya-u.ac.jp/pdf/MIST_no_susume.pdf 環境設定もこのpdfの19ページに従い行いました. 上記のpdfのとおりにサンプルプログラムを順番に動かしてみたら,画像の入出力などは正常にできました. が,17ページのサンプルプログラムを実行しようとすると,以下のようなエラーが大量に出てしまいます. ===================================================== 1>MSVCRT.lib(ftol2.obj) : error LNK2005: __ftol2 は既に libF77.lib(ftol2.obj) で定義されています。 1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 (中略) 1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 1>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>C:\Documents and Settings\(ユーザ名)\My Documents\Visual Studio 2010\Projects\test\Debug\test2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 ===================================================== 使用環境はWindows XP,Visual Studio2010です. プログラミングは初心者です. .NETというものがよくわからないので,Visual Studioを使っているのですが,これが問題でしょうか?Visual Studioではできないのでしょうか?(画像の入出力などは正常に処理できたので,LAPACKの設定がうまくできていないだけだと自分では思っているのですが・・・) どなたか詳しい方がいらっしゃいましたら,教えてください. よろしくお願いいたします.

  • cursesの呼び出し規約について

    cursesをはじめて使用したいのですが。 呼び出し規約でエラーが生じて利用することができません。 Windows7でvisual studioを用いています。 ある制御プログラムを書いているのですが、この場合では呼び出し規約を__stdcall (/Gz)に設定しています。 この呼び出し規約の条件でcursesを利用しようとすると以下のような LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>curses.obj : error LNK2001: 外部シンボル "_refresh@0" は未解決です。 エラーが出てきてしまいビルドすることができません。 用いているcursesのプログラムは以下のようなシンプルなものです。 #include <curses.h> int main() { initscr(); printw("Hello World !!!"); refresh(); getch(); endwin(); return 0; } 同じプログラムで呼び出し規約を__cdecl (/Gd)にしてあげるとうまくビルドができ実行することが可能なのですが、呼び出し規約を__cdecl (/Gd)に設定すると 某社(PCIボードを提供している会社です)の関数が使用できなくなってしまいます。 呼び出し規約を__stdcall (/Gz)でcursesを使用したいのですが。どのように改善すればよいのでしょうか?  アドバイスよろしくお願いします。

  • .exeファイルが開けません

    Visual C++ 2005 Express Editionを使用しています プログラムをコンパイルしてそのEXEファイルを友達に渡したんですが このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。 アプリケーションを再度インストールす事により問題が解決する場合があります。 と言うエラーが出るらしく実行できません 調べてみたらランタイムライブラリをマルチスレッド(/MT)にすると直るということはわかったんですが マルチスレッド(/MT)にするとエラーが出てしまいます main.obj : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) は既に msvcprtd.lib(MSVCP80D.dll) で定義されています。 LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。。 libcpmtd.lib(cin.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__malloc_dbg" は未解決です。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__free_dbg" は未解決です。 C:\C++\計算\Debug\計算.exe : fatal error LNK1120: 外部参照 4 が未解決です。 エラーは文字数の関係で大幅に削ってあります 作成したプログラムも上げておきます http://www.uploda.net/cgi/uploader4/index.php?file_id=0000008742.exe よろしくお願いします

  • ATLとSTLの違いは何でしょうか?

    ATLとSTLの違いは何でしょうか? STLでもリスト構造(線形リスト、[双方向リスト]) #include <list>があるみたいですが・・・ STLはC++の標準テンプレートライブラリ(そのまま)と理解しています。 あと、ActiveXとALTの違いも知りたいです。 極論しますが、ActiveXとはOCXを作ることでしょうか?

  • LIBCMT.LIBをリンクしてコンパイルすると警告が。

    LINK : warning LNK4098: defaultlib 'LIBC' conflicts with use of other libs; use /NODEFAULTLIB:library というのがでるんですけど、もともとリンクしているLIBCというライブラリ?と、関数がかぶってしまっているためなんでしょうか。 /NODEFAULTLIBオプションを使え?みたいなことを言ってますが、 cl /? で調べてもそんなオプションありませんし。 この場合の解決法のご教授をお願いします。

  • warning LNK4098で試行錯誤しています

    環境はOS:Win98 VisualStadio6.0を使用して作成しています。作成言語はC言語とFORTRAN言語です。FORTRANのコンパイルははVisualFortoranをインストールしています。 現象は、Cで作ったメインの中でフォートランを呼ぶCのスレッドを_beginthreadを使って作成しています。この状態でビルドすると「warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs; use /NODEFAULTLIB:library」が出ます。そこで、プロジェクト設定のリンクタブで無視するリンクライブラリを以下のように設定してビルドしましたが。同じ現象でした。 無視するライブラリ:libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib 何方か教えて頂けないでしょうか、宜しくお願いいたします。

  • CygwinでSTLの勉強をしていますが・・・

    今C++のSTLの勉強をしています。 本に載っているサンプルプログラムを打って実行しようとしたら エラーがでてしまいました。 エラーの内容はprintとtotalが見つかりませんというエラーです。 コンパイラはcygwinを使ってます。 よろしくお願いします。 /*for_each()アルゴリズム*/ #include<iostream> #include<algorithm> #include<vector> #include<functional> #include<> using namespace std; int main() { int n[]={100,200,300,400,500,600}; int size=sizeof n/sizeof(int),i; vector<int> v; for(i=0;i<size;++i) v.push_back(n[i]); for_each(v.begin(),v.end(),print<int>()); cout<<endl; cout<<(for_each(v.begin(),v.end(),total<int>())).gettotal()<<endl; return 0; }

  • STLのlistとrandを使うと異常終了します

    STLの勉強をしているものです。VisualC++6.0で正常に動作するプログラムをVusialC++2008ExpressEditionで動かしたら異常終了しました。色々調べていくと、乱数値をセットしたlistをマージするときに異常終了するようです。尚、異常終了するのはDebugビルドのときのみで、Releaseビルドのときは正常に動作します。異常終了するプログラムを以下に載せておきます。どなたかご教授お願い申し上げます。 #include<list> #include <time.h> #include <stdlib.h> using namespace std; int main(int argc, char* argv[]){ list<int> lst1, lst2; int i, n; srand(time(NULL)); for( i = 0 ; i < 5 ; i++ ){ n=rand() % 10; lst1.push_back( n ); } for( i = 0 ; i < 5 ; i++ ){ n=rand() % 10; lst2.push_back( n ); } lst1.merge( lst2 ); // リストをマージ ここで異常終了 return 0; }

  • C++ 多態とstlのコンテナについて

    以下のように、継承関係を作ります。 --------------------------------------- #include <iostream> #include <list> #include <vector> using namespace std; struct Base { virtual ~Base() = 0; }; Base::~Base() {} struct Sub1 : Base { int v; Sub1(int i) { v = i; } }; struct Sub2 : Base { double v; Sub2(double d) { v = d; } }; --------------------------------------- この場合、 Sub1, Sub2 のインスタンスをなにかコンテナに入れたい場合は、一般的には以下のように書けばいいのでしょうか? ---------------------- list<Base*> l; vector<Base*> v; Sub1 s1(3); Sub2 s2(4.4); l.push_back(&s1); l.push_back(&s2); v.push_back(&s1); v.push_back(&s2); ---------------------- list<Base>, vector<Base>も試しましたが list<Base> は宣言したところで vector<Base> は push_back() したところで コンパイルエラーになりました。 これは、こういうものなのでしょうか? むしろ、struct(もしくはclass)の書き方を変えたりすれば、問題なくなったりするのでしょうか? 全体としては、C++は参照などあって、どいう場合にポインタ使うべきなのかそういう部分に混乱しているような気もします。 いろいろ質問してしまって、申し分けないですがなにか ひとつでも答えられるものがあれば回答してもらえると ありがたいです。

専門家に質問してみよう