gprof「undefined reference to `mcount’」エラー回避

Posted on

gprofの概要とか。

 gprofが何なのかよく分かってる人は次の項目からどうぞ。

 現在、Eclipse+CDTを使ってCでゲームを書いているのですが、ちょっと遅い。どこにボトルネックがあるのか気になっていたのですが、手動で時間を計るのは、さすがにめんどくさい。

 というわけでいろいろ探してたところ、どうもGNUのgprofという、関数別に実行時間を測定してくれるソフトがあるらしい。まあ多分一般常識レベルなんでしょうけどね、この世界だと・・・。

 利用するためにはプロファイルというのが必要で、ビルドオプションをいじって、実行後にプロファイルがexeファイルと同じフォルダに出来上がるようにしなきゃいけないらしい。で、このプロファイルとexeファイルをgprofに流し込むと分析してくれるそうな。

 で、Eclipseの設定を眺めると、コンパイラのデバッグオプションの設定項目に、gprof用のプロファイルを出力するオプションがあります。これをチェックすればいいのか、やっぱGUIって何だかんだ言って楽だ†1な、と思って余裕でクリーンコンパイルしたところ、

undefined reference to `mcount'

というのがリンク時に出てきて完了できない。結構これで詰まってる人は多いんじゃないでしょうか。だって、EclipseCDTはこれしか設定項目がないから

 で、長々と書きましたが、結局は、どうやってEclipse+CDTでプロファイルを出力する実行ファイルを出力するか、がこの記事でやりたいことです。

リンクエラーが出てしまった原因。

 こちらを参考にすればすぐわかる事ですが、コンパイラオプションだけでなく、リンカオプションにも-pgオプションを設定する必要があります

 Eclipse+CDTの設定項目はコンパイラオプションにしか追加してくれません。何考えてるの?

Eclipse+CDTでプロファイルを出力させるには

まずは、[プロジェクト]->[プロパティ]->[C/C++ビルド]を表示させておきます。

コンパイラオプション

 [GCC C コンパイラー]->[デバッグ]で表示される設定項目のうちの、[gprof向けプロファイル情報の生成(-pg)]をチェック

リンカオプション

 [GCC C リンカー]->[その他]の、リンカー・フラグに「-pg」を追加します。

テストするには

 上記を設定したあとに完全コンパイルしたあとに一回実行して、gmon.outが出力されていることを確認。

 コマンドプロンプトを起動して、gprof.exeにパスが通っていることを確認した後にコンパイルしたexeファイルと同じフォルダに移動して、

gprof ***.exe gmon.out -p

とすると、各関数別の実行時間を表示してくれます。下のほうの英文が要らないと思ったら「-b」オプションです。

 なお、静的ライブラリにおいては、コンパイルオプションに-gpがついていると時間測定はしてくれるようですが、何回呼び出されたか、に関しては分からないみたいです。ゲームのうちの中核部分は静的ライブラリにして呼び出していたので、これは残念・・・・。

ちなみに

 合計で0.01秒以上実行時間がないと時間が不明なので、ゲームの場合は結構な時間動かしておかないと測定できないかも。ゲームで0.01秒って言ったらかなり長い時間ですからね。約0.6フレーム。

どうでもいいこと

うさだBlog」をアンテナに追加しました。鋭すぎる。ネトゲ以外にも話題はあるので、ぜひご一読をお勧めします。プログラミング技術もすごいっぽい。

 こういう人に成りたいなぁ。どうやったら成れるのかなぁ。とりあえずはお勉強がんばります。。。。

 要するに、ヵっぉぉゃっょ。

 何をいまさら。7~8年くらい前にぁゃιぃわーるど周辺ではやってませんでしたっけ、この表現。タイトルからしてそうですし。というか、あんぐら全般?今の女子中学生があんな書き込みを見たら、なんて思うのかな?w

  • †1: まあGUIってホント糞なUIだな、CUI最高と思うこともあるわけですが。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください