C++Builder メモ 戻る
- C++Builderでコンパイルする際に気がついた事など
ヒント、注意
[BCC32 エラー]
LME288のリンカー エラーの回避方法を試行錯誤してみました
- 再インストール(変更)し、Window10の再起動、これでエラーは出なくなりました
- エンバカデロのサポートへの問い合わせ結果
ME288のエラーについてご報告いただきまして誠にありがとうございます。
LME288のエラーは、メモリ関連のエラー(Out of Memory等)の一種で、
詳しい発生理由はまだ不明なのですが、アプリケーションの利用状況などによって、メモリの断片化が発生し、必要メモリが確保できない場合に生じるのではないかと考えます。
なお、PCの再起動直後とか、C++Builderを再起動すると同エラーが解消することがあります。
またlink32のモジュールは、32ビットプロセスで実行されるモジュールしていますので、32ビットのメモリの壁が存在し、サイズが大きいファイルやリンクするファイルの数が多いケースでは、
同エラーが発生しやすくなります。
なお、LME288エラーは他のお客様から同様の報告事例がございますが、弊社の開発部内で再現できないケースが多く、根本的な修正には至っていないというのが現状です。
弊社ではなく外部の情報ですが、LME288 関連の情報(解決策)として stackoverflowというサイトで
下記のような記事がありました。
http://stackoverflow.com/questions/28929516/c-builder-xe7-lme288-error
上記の情報のうち、投票数の多い順にピックアップすると以下のような項目になります。
(1) 管理者権限で "bcdedit /set IncreaseUserVa 3072" を実行してOSを再起動する。
ちなみに IncreaseUserVa で docwiki を検索してみたら、こういうページも出てきました。
http://docwiki.embarcadero.com/RADStudio/Berlin/ja/%E3%83%A1%E3%83%A2%E3%83%AA_%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93%E3%82%92%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B
(2) ilink32.exe や bcc32.exe の LARGEADDRESSAWARE を有効にする。
なお、ILINK32.EXEは、LARGEADDRESSAWAREのオプションは有効になっていないため、ユーザープロセスが利用できるメモリサイズの上限は2GBです。
非公式ではありますが、以下のツールを利用するとLARGEADDRESSAWAREを有効にでき、メモリサイズの上限を4GB弱まで増やすことができます。
1. 以下のURLからツールをダウンロード
http://cc.embarcadero.com/Item/30459
※LAMarkerというツール利用すると PE headerを書き換えて LARGEADDRESSAWARE を有効にできることができまするようです。
2. コマンドプロンプトから以下のように実行
lamarker -M -Filink64.exe .... ilink64.exe lamarkerを同じdirになければ駄目
(3) 起動ドライブのディスククリーンアップを行う。
(4) DEP (データ実行防止) の検査対象から ilink32.exe を除外する。
(5) アンチウィルス製品の検索対象から C:\Program Files (x86)\Embarcadero\bin
を除外する。
上記のどの手段を試しても解決しない恐れはございますが、念のためご案内させていただきます。
なお、
最新版であるC++Builder 10.2では、ラージメモリアドレスを認識できるようになり、
リンカの問題に関しても多少改善されております。
http://edn.embarcadero.com/jp/article/44749
https://community.embarcadero.com/blogs/entry/new-in-10-2-2-c-and-debugger-improvements
お客様の遭遇する問題が必ずも解決する保証はできませんが、
10.2へのアップグレードをどうかご検討ください。
以上よろしくお願いいたします。
unsigned char *ucBuf,*ucBuf1;
DWORD dwLen;
AnsiString FNAME;
FILE *fp;
WIN32_FIND_DATA dat;
char c;
AnsiString w,sBuf;
[BCC32 エラー] main.cpp(37): E2015 '_fastcall Sysutils::IntToStr(int) at c:\program files\embarcadero\rad studio\8.0\include\windows\rtl\SysUtils.hpp:2183'
と '_fastcall Sysutils::IntToStr(__int64) at c:\program files\embarcadero\rad studio\8.0\include\windows\rtl\SysUtils.hpp:2186' の区別が曖昧
- MAIN_F→MaskEdit2→Text="Line= "+IntToStr(point.y)+" : "+IntToStr(point.x);
- → MAIN_F→MaskEdit2→Text="Line= "+IntToStr((int)point.y)+" : "+IntToStr((int)point.x);
[BCC32 エラー] Unit1.cpp(151): E2034 'wchar_t *' 型は 'const char *' 型に変換できない
- fp=fopen(Form1→Edit2→Text.c_str(),"w+b");
- → fp=fopen(AnsiString(Form1→Edit2→Text).c_str(),"w+b");
- Application→MessageBox("プラウザを解析しました","報告",0);
- → Application→MessageBox(L"プラウザを解析しました",L"報告",0);
- Application→MessageBoxA(path.c_str(),"報告",0);
- → Application→MessageBoxA(UnicodeString(path).c_str(),L"報告",0);
- char *tmp;
RichEdit1→SetSelTextBuf(tmp);
- → String t=tmp;
RichEdit1→SetSelTextBuf(t.c_str());
- char svName[BUFSIZE];
strcpy(svName,Form1→ComboBox1→Text.c_str());
- → strcpy(svName,AnsiString(Form1→ComboBox1→Text).c_str());
[bcc32 エラー] Unit5.cpp(152): E2034 'char *' 型は 'const wchar_t *' 型に変換できない
-
修正前のソ−ス
AnsiString drv;
drv=Form5->Label1->Caption.SubString(1,3);
SetVolumeLabel(drv.c_str(),Edit1->Text.c_str());
-
修正後のソ−ス (1:、2:、3: 何れもエラ−は出なくなる)
1:
String path,drv;
drv=Form5->Label1->Caption.SubString(1,3);
wchar_t* L0=new wchar_t[drv.Length()+2];
wcscpy(L0, drv.c_str());
path=Edit1->Text;
wchar_t* L1=new wchar_t[path.Length()+2];
wcscpy(L1, path.c_str());
SetVolumeLabel(L0,L1);
2:
String drv;
drv=Form5->Label1->Caption.SubString(1,3);
SetVolumeLabel(drv.c_str(),Edit1->Text.c_str()))
3:
TCHAR drv;
drv=Form1->Label9->Caption.SubString(1,3);
SetVolumeLabel(drv.c_str(),Edit1->Text.c_str());
GroupBox1->Caption=Edit1->Text;
[BCC32 エラー] main.cpp(107): E2034 '_WIN32_FIND_DATAW' 型は '_WIN32_FIND_DATAA' 型に変換できない
WIN32_FIND_DATA GFileData; で上記エラ−
→ WIN32_FIND_DATAW GFileData; WIN32_FIND_DATAWに変更すればよい(unicode)
[BCC32 エラー] main.cpp(237): E2357 参照は 'AnsiString' で初期化されているが 'UnicodeString' 型の左辺値が必要
[BCC32 エラー] main.cpp(237): E2340 1 番目のパラメータは UnicodeString & 型として定義されているので char * 型は渡せない
- AnsiString drv;
if(GetDrvInfo(drv) !=-1)
- → String drv;
if(GetDrvInfo(drv) !=-1)
[BCC32 エラー] Main.cpp(24): E2357 参照は 'void *' で初期化されているが 'void *' 型の左辺値が必要
- HDROP &Drop = (HDROP)Message.Drop;
int drop_files = DragQueryFile(Drop, 0xFFFFFFFF, NULL, 0);
- → HDROP &Drop〜の行を削り、
int drop_files = DragQueryFile(( void *)Message.Drop, 0xFFFFFFFF, NULL, 0);
UINT DragQueryFile(
HDROP hDrop, // ファイル名構造体のハンドル
UINT iFile, // ファイルのインデックス番号
LPTSTR lpszFile, // ファイル名を格納するバッファ
UINT cch // バッファのサイズ
[BCC32 エラー] catlog1.cpp(1174): E2335 このコンテキストではオーバーロード 'Pos' が曖昧
- Pos
- → iPos
Form1で String TMP;として、Form2では extern AnsiString TMP; としてもエラ−とならない
ただ、Form2で TMP=TESTとしても、Form1では文字化けしてしまい、C++Builder6.0のプログラ・を
XE用に直すときに注意しないと文字化けのバグで悩みます。
String t0;
wchar_t t1[200];
char w[250];
t0="D:\\Test";
sprintf(w,"%40s",AnsiString(t0));
swprintf(t1,L"%40s",t0);
[BCC32 エラー] E2034 wchar_t型はchar*型に変換できない、 E2342 パラメ−タ dstはchar*型として定義されているので wchar_tは渡せない
//-----------------------------------------------------------------------------------------
BC6.0のソース strcpy(lbl.lfFaceName, "@MS ゴシック") をXE3でコンパイルすると上記エラ−が出るが、StrPCpy(lbl.lfFaceName, L"@MS ゴシック")でOK
//------------------------------------------------------------------------------------------
String SFNAME,DFNAME;
CopyFile(SFNAME,DFNAME,false)をコンパイル
[bcc32 エラー] Unit1.cpp(253): E2342 パラメータ 'lpExistingFileName' は const wchar_t * 型として定義されているので UnicodeString は渡せない
CopyFile(SFNAME.c_str(),DFNAME.c_str(),false) とすれば OK
//---------------------------------------------------------------------------------------------