ha's notepad II

メモ書きです。

GCC(G++)でC++をコンパイルすると動作が止まった

GCCには、C++コンパイラ(g++)も含まれている。行列演算とかでC++のライブラリを使ってみたくなったのでテストしてみた。

#include <iostream>
using namespace std;

int main(){
    double k=1.0138100;
	
	cout << "テスト" << endl;
	cout << "Hello, C++!!" << endl;
	cout << k << endl;
	return 0;
}

これをコマンドプロンプトから、

>g++ hello.cpp -o hello.exe
>hello

とコンパイルして実行してみたところ、

テスト
Hello, C++!!

とまで表示されたはいいものの、「hello.exe は動作を停止しました」というWindowsのエラーメッセージが表示され止まってしまった。何故かと調べていた所、どうやらMinGWのライブラリのリンクがうまく行っていないために、Windowsでは実行できなかったようだ。ちなみに、MSYSのほうからコンパイルして実行すると、

>g++ -static hello.cpp -o hello_s.exe
>hello_s
テスト
Hello, C++!!
1.01381
>

と問題なく実行できて終了した。

これを解決するためには、g++のオプションで「-static」を付け、ライブラリを静的にリンクする必要があるようだ。このオプションを入れると、たしかにコマンドプロンプトからでも最後まで正常に作動するようになった。

ただしこれはMinGWに含まれているライブラリがexeファイル内にリンクされるらしく、ファイルサイズが増えてしまう。実際、このプログラムもstaticオプションなしでは26kBだったが、staticをつけることで1,278kBにもサイズが膨れ上がってしまった。でも、動かないよりはマシかと考え、当面はこれで動かすことに。

ちなみに、このプログラムで動作を止めた犯人は、

cout << k << endl;

の部分らしく、ここを削除したらstatic無しでもエラーを吐かなくなった。とはいえ、数値計算で途中経過をディスプレイに出せないのは痛い。