[英]C++ runtime errors in CodeBlocks when printing strings with cout <<
我最近開始使用CodeBlocks並開始遇到奇怪的運行時錯誤,我已經追溯到使用cout <<打印字符串。 例如,甚至以下..
#include <string>
#include <iostream>
int main()
{
std::string str;
str = "Hi!";
std::cout << str << std::endl;
return 0;
}
導致錯誤。 它會編譯好(使用Borland),但是當我運行它時,我得到一個彈出窗口,說“test.exe已經停止工作”,在控制台中我收到消息:
Process returned -1073741819 (0xC0000005) execution time : 1.526 s
Press any key to continue.
它在MS Visual C ++中編譯並運行良好,在Ubuntu中使用G ++。任何想法都將非常感謝!
干杯,Weatherwax
我的一次性評論最終幫助解決了問題所以在這里它被打包成未來用戶的答案:
這家伙有一個類似的問題,最終成為他修復的鏈接器問題。 修復是線程中的最后一個帖子,雖然讀取整個線程可能對您有用。
長話短說:Borland編譯器有點過時且使用起來很煩人。 結束了作為borland內部的鏈接器問題。 最好使用不同的編譯器,如GCC / G ++或Visual Studio編譯器。
這個答案是為了詳細說明問題的根本原因。
崩潰程序的原因是因為鏈接了錯誤的運行時庫。 具體來說,您的示例編譯為單線程對象文件(默認),但鏈接步驟使用多線程 cw32mt.lib
運行時 - cw32mt.lib
的“mt”后綴表示多線程。
解決方案是確保編譯程序的運行時使用與您鏈接的運行時匹配。 有幾種方法可以做到這一點。
重要的bcc32編譯開關:
-tW Windows GUI program. WinMain() is expected
-tWC Windows Console program. main() is expected. default.
-tWR Use dynamically linked runtime. Absence implies static runtime linkage.
-tWM Use multithreaded runtime. Absence implies single thread.
將您的示例程序編譯為單線程,如下所示:
bcc32 -oexample.obj -c example.cpp
ilink32 -ap example.obj c0x32,example.exe ,, cw32.lib import32.lib ,,
或者你可以像這樣編譯多線程(注意-tWM
開關與cw32mt.lib
匹配):
bcc32 -tWM -oexample.obj -c example.cpp
ilink32 -ap example.obj c0x32,example.exe ,, cw32mt.lib import32.lib ,,
第三種方法更容易,更容易出錯,就是不要自己調用鏈接器。 相反,讓編譯器間接驅動鏈接器(類似於gcc):
bcc32 -tWM -oexample.obj -c example.cpp
bcc32 -tWM example.obj -eexample.exe
對於您的簡單示例,它甚至可以縮短為:
bcc32 -eexample.exe example.cpp
最后,您可以多次傳遞-tW
開關。 例如,此命令將您的示例編譯為具有多線程支持和動態運行時鏈接的控制台程序:
bcc32 -tWM -tWR -tWC -eexample.exe example.cpp
生成的example.exe
可執行文件要小得多,其導入表有一個CC3250MT.DLL
條目,確認borland運行時是動態鏈接的。
我們不應該假設一個不起作用的程序是由不符合標准或我們正在使用的工具中的錯誤引起的, 而沒有首先將用戶錯誤作為潛在原因進行調查(即使在這種情況下它很有誘惑力)。 在OP的情況下,code :: block IDE沒有為正在使用的工具鏈設置正確的命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.