ページ 11

C++/CLIについて。

Posted: 2008年5月05日(月) 17:22
by tk-xleader
2つ質問があります。よろしくお願いします。

1:
C++/CLIでvectorクラスを使いたいのですが、以下のようなコードをコンパイルすると、その下のようなエラーが出てコンパイルできません。
#using "System.dll"

#include<vector>
#include<algorithm>

using namespace std;
using namespace System;

int main()
{
	vector<int>a;
	std::fill_n(std::back_insert_iterator<vector<int> >(a),100,100);
	for(vector<int>::iterator itr=a.begin();itr!=a.end();itr++){
		Console::WriteLine("{0}",*itr);
	}
	return 0;
}
をコンパイルすると、次のようなエラーが出ます。
error LNK2028: 未解決のトークン (0A0000DA) "extern "C" int __cdecl _CrtDbgReportW(int,wchar_t const *,int,wchar_t const *,wchar_t const *,...)" (?_CrtDbgReportW@@$$J0YAHHPB_WH00ZZ) が関数 "public: int const & __thiscall std::_Vector_const_iterator<int,class std::allocator<int> >::operator*(void)const " (??D?$_Vector_const_iterator@HV?$allocator@H@std@@@std@@$$FQBEABHXZ) で参照されました。
error LNK2019: 未解決の外部シンボル "extern "C" int __cdecl _CrtDbgReportW(int,wchar_t const *,int,wchar_t const *,wchar_t const *,...)" (?_CrtDbgReportW@@$$J0YAHHPB_WH00ZZ) が関数 "public: int const & __thiscall std::_Vector_const_iterator<int,class std::allocator<int> >::operator*(void)const " (??D?$_Vector_const_iterator@HV?$allocator@H@std@@@std@@$$FQBEABHXZ) で参照されました。

APIの関数を呼び出した際にも同じエラーが出たのですが、エラー番号などでググってみて、APIのほうは設定にミスがあり、それを直すとリンカエラーもなくなり解決したのですが、STLのほうは全くといっていいほど解決しません。なぜでしょうか?

2:
C++/CLIがWindows APIとの共存が可能だということで、たぶんMFCやATLなどのクラスライブラリなども共存可能と思いますが、MFCとATLのうち、.NETとの共用を考えたら、どちらのほうを選択するほうがいいのでしょうか?

Re:C++/CLIについて。

Posted: 2008年5月05日(月) 17:33
by tk-xleader
リリース設定の時はこのエラーが出ません。関数名からしてデバッグ系統の関数というのは分かるのですが、なぜデバッグ系関数+STL+C++/CLIの組み合わせでリンカエラーが出るのでしょうか?

Re:C++/CLIについて。

Posted: 2008年5月06日(火) 01:49
by たかぎ
ちゃんと調べていないので当て推量ですが...

リリース版ではNDEBUGマクロが定義されるはずですが、この辺りのプロジェクトの設定を変えていませんか?
ライブラリの内部でassertマクロが使われていて、そこから_CrtDbgReportWが参照されているのではないかと思います。

Re:C++/CLIについて。

Posted: 2008年5月06日(火) 05:57
by tk-xleader
回答ありがとうございます。

NDEBUG定数関連については何も触ってません。後、エラーが出るのはデバッグ時だけです。なのでリリース時は全く問題ありませんでした。

プロジェクトのコマンドライン設定はこうなっています、コマンドラインから設定を推量するというのはたぶんできると思いますので掲載します。

[コンパイラへ]
/Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /FD /EHa /MD /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Zi /clr /TP /errorReport:prompt

[リンカへ]
/OUT:"C:\programfile\VC\CLRtest\Debug\CLRtest.exe" /INCREMENTAL /NOLOGO /MANIFEST /MANIFESTFILE:"Debug\CLRtest.exe.intermediate.manifest" /DEBUG /ASSEMBLYDEBUG /PDB:"c:\programfile\VC\CLRtest\debug\CLRtest.pdb" /MACHINE:X86 /FIXED:No /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

Re:C++/CLIについて。

Posted: 2008年5月06日(火) 11:15
by Justy
 コンパイラのオプションで、デバッグなのに /MDなのが問題な気がします。
 デバッグなら /MDdだと思います。

Re:C++/CLIについて。

Posted: 2008年5月06日(火) 13:15
by tk-xleader
Justyさん、ありがとうございます。設定をマルチスレッド デバッグ DLL(/MDd)に変更したらエラーがなくなりました。ありがとうございます。

ところで、CLIのコンソールウィンドウが出ないようにするにはコマンドラインに何を指定すればいいのでしょうか? 再びよろしくお願いします。

Re:C++/CLIについて。

Posted: 2008年5月06日(火) 13:41
by Justy
>CLIのコンソールウィンドウが出ないようにするに
 んー、あんまり詳しくはないのですが、上記の状態からそうするのであれば
リンカのサブシステムの項目を Windowsに、エントリポイントを mainにすれば
コンソールが開くことなく実行できる、と思います。

Re:C++/CLIについて。

Posted: 2008年5月06日(火) 15:48
by tk-xleader
ありがとうございます。きれいにウィンドウのみが表示されました。