こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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)で作成しています。

どなたか、この問題を解決する方法をご存知ないでしょうか?
よろしくお願いします。

投稿日時 - 2010-06-02 16:49:01

QNo.5939784

すぐに回答ほしいです

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

#pragmaディレクティブでリンクすると成功したというのは、
リリース版でのリンクが成功したということでしょうか?
であれば、リリース版のプロジェクト設定が行われて
いなかっただけの可能性が高いです。

どの様に判断されたかわかりませんが、
その状態で、バージョンが関係ないと
言われても説得力がありません。

DirecX9は古いバージョンと
新しいバージョンでは引数の変更により、
外部シンボルが変更されています。

特に、質問にあるエラーはランタイムライブラリに
ついてのリンクが2重に行われている場合に出るエラーです。
旧バージョンのDirectXはスタティックリンクである場合もあり、
STL以外に独自のライブラリなどを使っている場合には
Cのランタイムが既にリンクされている場合もあります。

投稿日時 - 2010-06-20 19:48:03

お礼

ご回答、ありがとうございます。

March 2008

Summer 2004

の優先度でディレクトリを設定しています。
Summer 2004があるのは、
DirectX8でプログラムをする際に
d3d8.h
d3dx8.h
を使用する為です(これ以降のバージョンには含まれていないので)。

投稿日時 - 2010-06-20 23:27:30

このQ&Aは役に立ちましたか?

15人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

DirectXの環境が2つ入っているということでしょうか?
環境がちょっと良く分かりませんが、
SDK的には共存させないほうが良いと思います。
#見た感じMSにはできるとも出来ないとも書いてないですが。
#そういう場合は大抵、過去の機能はバッサリ切って、
#コンパイルスイッチで切り分けておくほうが良いと思います。

1つ目のデバック版でのエラーについては、
一応、確認ですが独自で作成したライブラリなどは
使用されていないでしょうか?
もし、使用しているならCのランタイムライブラリを
使用していないかなどを確認し必要なら、
警告にあるとおり、/NODEFAULTLIB:libraryなどで
ランタイムを無視してリンクする必要があるかもしれません。
#リンクできてもまともにデバッグできないかもしれませんが。

LIBCMTとあることから、
デバッグ版リンクであるにもかかわらず
リリース版のライブラリオブジェクトを
含んでいるスタティックリンクライブラリが、
リンクしようとしているオブジェクトに含まれているようです。

この為、既にリンクされたライブラリと競合しているうえに、
デバッグ版とリリース版で差異があることから、
関数シンボルが見つからないといわれています。

>コード生成モードは、マルチスレッド(/MT)で作成しています。
念のためこれも確認ですが、
これはリリース版についてということで良いでしょうか?
デバッグ版である場合は、デバッグ版のコード生成モードが
(/MTd)になっているかを確認してください。
STLで使用されるリンクライブラリが異なります。

2つ目のエラーはさきの回答でも書きましたが、
デバッグ版では指定されている、リンクライブラリの設定が
リリース版でされていない可能性があるので、
確認してみてください。

投稿日時 - 2010-06-22 05:46:15

お礼

ご回答、ありがとうございます。

確認もしてみましたが、リリース版(/MT)となっていました。
元々がVC++のランタイム依存問題が嫌いなので、まず間違いなくコード生成の
設定は変更しています。

やはり、SDKの競合が発生しているのかもしれませんが#pragmaディレクティブでも同じ結果にならないことは少々疑問ではありますが…。

自作または他のライブラリは一切使用していません。MS一筋です。

投稿日時 - 2010-06-22 12:35:26

ANo.2

お使いのDirectX SDKのバージョンはいくつですか?

投稿日時 - 2010-06-17 01:40:45

お礼

DirectXのバージョンは関係ないようです。
#pragmaディレクティブでリンクすると問題なくコンパイルできました。

ですが…やはり、通常の方法でリンクできることに越した事はありませんね。
そもそも、STL自体がリンクできないことに疑問がありますし…。

最後になりましたが、ご回答ありがとうございます。
何か思い当たる節などありましたら、またの助言をお願いします。

投稿日時 - 2010-06-17 15:12:42

ANo.1

単純にリンクするファイルの指定が足りないだけかと・・・

D3dx9.libとかD3D9.libとか・・・

投稿日時 - 2010-06-02 18:08:24

補足

画像のように…とありましたが、いつのまにかgooは画像が指定できなくなったことを今更知りました。

d3d9.lib d3dx9.lib dxerr9.lib dxguid.lib

上記のとおり、ライブラリの指定は問題ありません。

投稿日時 - 2010-06-02 21:14:29

お礼

ご回答、感謝です。

画像の様にリンカは設定済みです。
ソリューションの構成をDebugにするか、コードの生成を/MTに指定しなければ
問題なくリンクもできますし、実行もできます。
…ただ、リストを使用しなければが前提ですが。

投稿日時 - 2010-06-02 21:11:13