C++/CLIについて。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tk-xleader

C++/CLIについて。

#1

投稿記事 by tk-xleader » 17年前

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との共用を考えたら、どちらのほうを選択するほうがいいのでしょうか?

tk-xleader

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

#2

投稿記事 by tk-xleader » 17年前

リリース設定の時はこのエラーが出ません。関数名からしてデバッグ系統の関数というのは分かるのですが、なぜデバッグ系関数+STL+C++/CLIの組み合わせでリンカエラーが出るのでしょうか?

たかぎ

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

#3

投稿記事 by たかぎ » 17年前

ちゃんと調べていないので当て推量ですが...

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

tk-xleader

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

#4

投稿記事 by tk-xleader » 17年前

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

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

Justy

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

#5

投稿記事 by Justy » 17年前

 コンパイラのオプションで、デバッグなのに /MDなのが問題な気がします。
 デバッグなら /MDdだと思います。

tk-xleader

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

#6

投稿記事 by tk-xleader » 17年前

Justyさん、ありがとうございます。設定をマルチスレッド デバッグ DLL(/MDd)に変更したらエラーがなくなりました。ありがとうございます。

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

Justy

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

#7

投稿記事 by Justy » 17年前

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

tk-xleader

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

#8

投稿記事 by tk-xleader » 17年前

ありがとうございます。きれいにウィンドウのみが表示されました。

閉鎖

“C言語何でも質問掲示板” へ戻る