今日は久々にCをいじっていた。
久々といっても自分がかかわったことのないプロジェクトの産物で、しかもC++から始めたようなものである私にとってCはどちらかというとなじみのない言語。
カタコト的に取り扱っているレベルだ。
問題が起きている個所に対して調査用のログを出力するように変更してコンパイル実行。
ところが、リンカが文句を言いだす。
エラー LNK2001 外部シンボルXXXXが未定義です
見よう見まねで用意されたmakefileを使用してnmakeしているだけなのだが、うまくリンクができていないようだ。
書き換えた部分が問題とも思えなかったが、一応元に戻して実行しても同じエラーが出てしまう。
つまり、最初から用意されていた環境が悪かったことになる。エラーとされている関数はデバッグ用に使われている関数のようだが、そもそもリリース用にコンパイルしているので使っていないはずなのだが…。
当該ファイルは10年以上前のプロジェクト。当然移り変わりの激しい社内にこのプロジェクトに詳しい人間はいない。
これは困った。どうしていいかわからない
分からないのか。考えてないのか
さて、今回困ってしまったのは
- 自分の関わったことのないプログラムだった
- そもそもCに自信がない
- プロジェクトに詳しい人間がいない
- 変更前の状態であっても動かなかった
- これまではそれで動いていた?
等々の理由があったのだ。
結論から言うと、今回の問題は、複数のmakefileのうち、いくつかがリリース用のコンパイル時にまでデバッグとしてコンパイルするような文言が記述されていたことにあった。
恐らく、何かの調査のタイミングで一時的にmakefileを変更したものの、それを元に戻さずにいたことが今回の問題を引き起こしたのだと思う。
だが、今回解決できたのは論理的に答えを見つけたというよりはどちらかというと”手探りで”とか”手当たり次第に”的な手法によったもの。
後々考えてみると、
- リンクのエラー
- 当該関数はデバッグ用のものと思われる
- makefileが正しいことを証明できる人間がいない
- リリース用のコンパイルオプション指定にもかかわらずデバッグ用関数が混ざる
等の事柄から、
- 変更したオブジェクト周りのmakefileに何かしら問題がある
- 変更したオブジェクト周りにDEBUG条件付きコンパイル以外の個所でデバッグ用関数が用いられている
可能性を考え、答えに結びつけることはできたはずだ。
それを行わずに思考停止してしまったのは問題だ。
自分にとって不利な状況だとか、逃げ口上になりそうな内容があるとすぐにそちらへ行こうとしてしまい思考が停まってしまう。いけない傾向にある。
忙しいことは言い訳にはならないので、しっかりと。頭を使うよう教訓として覚えておこう。