トップページ > 過去ログ > 記事閲覧
共通言語ランタイムサポートについて
名前:EMIYA 日時: 2007/11/20 18:33

いつもDXライブラリにはお世話になってます。 色々と勉強しながら、どんどんプログラムの書き方を変えて行ってるんですが・・・ そろそろ、VS2005にしてみようかなと思いしてみたのですが、 共通言語ランタイムサポート(clr)とMT及びMTdのコマンドラインオプションは、 同時に指定できませんとでてしまいます。 なぜかVS2003では、clrとMTを同時に使ってもエラーがでません。 DXライブラリと共通言語ランタイムを同時に使うことはできないのでしょうか? 共通言語ランタイムを使おうとした目的は、StringBuilderというクラスが使いたかったからです。 何かしら回避方法があれば、教えていただけるとありがたいです。

Page: 1 |

Re: 共通言語ランタイムサポートについて ( No.1 )
名前:Will 日時:2007/11/21 10:29

共通言語ランタイム使用時は静的リンクライブラリは使用できないとMSから公式アナウンスがあります。 /MDまたは/MDtを使用すればよいようです。 参照 ttp://msdn2.microsoft.com/ja-jp/library/abx4dbyh(VS.80).aspx
Re: 共通言語ランタイムサポートについて ( No.2 )
名前:EMIYA 日時:2007/11/21 18:54

レスありがとうございます。 さっそくMDd?で試したのですが、 1>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll : fatal error LNK1302: リンクに安全な .netmodules のみサポートします。pure .netmodule にリンクできません。 とでてきました。 なので、オプションをclrからclr:safe(安全なMSIL共通言語ランタイムサポート)にしてみたのですが・・・ 今度は、エラーが1万7千を越えてもなお出続けるようなぐらい大量のエラーが・・・orz 大概上の辺りはこんなエラーがでました。 error C4956: 'va_list *' : この型は確認可能ではありません 1>c:\Program Files\Microsoft Visual Studio 8\VC\include\crtdefs.h(1709) : error C4959: アンマネージ struct 'localeinfo_struct' は、そのメンバへのアクセスによって確認不可能なコードを生成するため、/clr:safe で定義できません 念のために、clr:pure(純粋MSIL共通言語ランタイムサポート)のほうも試したんですが、 1>..\..\..\Aseria\main.cpp(32) : error C2373: 'WinMain' : 再定義されています。異なる型修飾子です。 1> c:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winbase.h(1875) : 'WinMain' の宣言を確認してください。 というエラーがでました。 最後に、clr:oldSyntax(共通言語ランタイムサポート、古い構文)もためしましたが、clrと同じ結果になりました。 やはり、DXライブラリと一緒に使うことはできないんでしょうか? 無理だとしても、なるべく高速に処理できる文字列クラスを教えていただけるとありがたいです。 用途は、ファイルから読み込んだ文字列を1行ずつ格納して、 それをさらに一行のなかで、区切り文字でトークンにわけてそれを配列の要素のようにアクセスしたいのです。 最後のは質問がかわっちゃってますが、できればよろしくお願いします。
Re: 共通言語ランタイムサポートについて ( No.3 )
名前:aujourd'hui 日時:2007/11/21 21:14

こんにちは。 作成したプロジェクトは、C++/CLIですか。それとも、ネイティブC++ですか。
Re: 共通言語ランタイムサポートについて ( No.4 )
名前:EMIYA 日時:2007/11/22 01:59

こんにちはaujourdさん。 質問に関しては、私の力量不足でナニをいってるのやら・・・orz プロジェクトはVS2005でVC++のWin32でWin32プロジェクトを選んで、 Windowsアプリケーションと空のプロジェクトにチェックしてあとは触らずで作ってます。
Re: 共通言語ランタイムサポートについて ( No.5 )
名前:aujourd'hui 日時:2007/11/22 09:32

VS2005から/clrと/MT,MTdは併用できなくなったようです。VS2005の/clrは一から作り直したものだとか。 Win32プロジェクトで作成したアプリはネイティブコードとも呼ばれます。つまり、普通のC/C++です。 C++CLIで作成したアプリというのは、普通のC++を.Net対応にしたものです。VS2003までは、Managed C++といっていました。こちらは、/clrと/MTや/MTdはあわせて設定しても問題は無かったようです(ないので、確認は出来ませんが) 前者(C/C++)は、共通言語ランタイムは使用しません。(使用するSDKはPratteForm SDK) 後者(C++/CLI)は、必ず共通言語ランタイムを使わなければなりません。(使用するSDKはFreamWork SDK) ですので、StirngBuilderクラスはC++/CLIであれば、利用できます。こちらの方はWin32でのコードも混ぜて利用できるようです。
Re: 共通言語ランタイムサポートについて ( No.6 )
名前:EMIYA 日時:2007/11/22 19:18

丁寧な説明ありがとうございます。 Win32ではなく空のCLRプロジェクトというので作ってみたところ、StringBuilderに関してはエラーがでなかったんですが・・・ 1>libpng.lib(pngerror.obj) : error LNK2001: 外部シンボル "__iob" は未解決です。 1>libpng.lib(pngrutil.obj) : error LNK2001: 外部シンボル "__iob" は未解決です。 1>libjpeg.lib(jerror.obj) : error LNK2001: 外部シンボル "__iob" は未解決です。 1>C:\Documents and Settings\\デスクトップ\Test\Release\Test.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と、/MT及び/MTdにしたなかったせいで、 ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=180 のような症状が・・・orz この問題は、スルーできるでしょうか? あとは、STLも使ってるのですが、 // VisualC++の標準メモリデバッグ機能又はSTLを使用する場合はコメントを外し、 // プロジェクトの設定でリンクするライブラリを『マルチスレッド デバッグ(/MTd)』 // に変更してください #define DX_USE_VISUALC_MEM_DEBUG ここはまだ問題がでてませんが、MTdにしないと予期しないエラーが発生するのでしょうか・・・
Re: 共通言語ランタイムサポートについて ( No.7 )
名前:管理人 日時:2007/11/23 22:09

 私の環境で色々試したところ、「空のCLR」から作成したプロジェクトで コンパイルすることが出来ましたが、この場合DXライブラリで使用している libjpeg.lib や libpng.lib 等を全て使用するランタイムを「マルチスレッドDLL」 に変更した上でコンパイルし直さなければならず、更にそうして作成したアプリは VisualC++ の DLL と .NetFramework がインストールされていないと起動できなく なってしまうので、なんとなく StringBuilder を利用する為だけにそれだけの デメリットを被るのはなんとなく勿体無いような気がします。  目的は文字列を配列の様にアクセスすること、とのことですが、その機能を ご自分で組まれてみるというのは如何でしょうか・・・
Re: 共通言語ランタイムサポートについて ( No.8 )
名前:EMIYA 日時:2007/11/24 00:20

レスありがとうございます管理人様。 たしかに、それらのためだけにするには大変ですね・・・orz 一応、途中からもう他ので代用しようと思い、いろいろ探してたら、 basic_symbolというのを発見したのでこれのソースを使わせてもらおうかなと・・・ 周りから、速度を過剰に気にしすぎとは言われてるのですが・・・ どうしてもstringが遅いとか、そういう書き込みを見てると我慢ならなくて、 かといって、自分でクラスを作ると確実に使いづらいものになるので・・・orz なので、とりあえずbasic_symbolとhash_mapの組み合わせで頑張ってみます。 レスしていただいた皆様ありがとうございましたー。

Page: 1 |