こんにちは業界のベテラン、
私は大学の3年生で、最初の夏のプログラミングインターンシップに着手しています。私が働いている会社は、90年代初頭からゆっくりと拡張し、変更している別の会社から巨大なアプリケーションを購入しました。このソリューションには、300を超えるファイルにまたがる200,000行を超えるコードが含まれています。ソリューション全体は、ANSI-C++標準に準拠しているとされています。コードはほとんど完全に文書化されておらず、そのほとんどは私には象形文字のように見えます。最終的に、私の仕事はこのコードを組み込みLinuxに移植することです。現時点では、私の仕事は、WindowsXPでVisualStudio2008を使用してコンパイルすることです。
今日、私は次のようなリンカーエラーに遭遇しています:
libcmtd.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR90D.dll)
私の理解では、これは、ソリューション内のさまざまなプロジェクトがさまざまなランタイムライブラリを使用してコンパイルされている場合によく発生します。私のソリューションには6つのプロジェクトがあります。4つはマルチスレッドデバッグDLLランタイムライブラリ(/ MDd)を使用してコンパイルするように設定され、1つはマルチスレッドデバッグライブラリ(/ MTd)を使用してコンパイルするように設定され、1つはマルチスレッドdllランタイムライブラリ(/ MD)。このエラーメッセージを受け取った後、最初に試したのは、すべてが同じランタイムライブラリでコンパイルされるように/MTdおよび/MDスイッチを/MDdに変更することでした。残念ながら、これによりafx.hで次のエラーが発生しました。
fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
少し掘り下げてみると、私はそれが私が何をする必要があるかをすでに教えてくれていることに気づきました。先に進み、[プロジェクトのプロパティ]->[構成のプロパティ]->[一般]の[MFCの使用]オプションを[共有DLLでMFCを使用する]に変更しました。この時点で、次のような未解決の外部エラーを数十個受け取り始めました。
dataPropertySheet.obj : error LNK2019: unresolved external symbol "public: __thiscall CResizableSheet::CResizableSheet(unsigned short const *,class CWnd *,unsigned int)" (??0CResizableSheet@@QAE@PBGPAVCWnd@@I@Z) referenced in function "public: __thiscall CdataPropertySheet::CdataPropertySheet(unsigned short const *,class CWnd *,unsigned int)" (??0CdataPropertySheet@@QAE@PBGPAVCWnd@@I@Z)
ResizableLib.lib(ResizablePage.obj) : error LNK2001: unresolved external symbol "public: virtual int __thiscall CWnd::Create(char const *,char const *,unsigned long,struct tagRECT const &,class CWnd *,unsigned int,struct CCreateContext *)" (?Create@CWnd@@UAEHPBD0KABUtagRECT@@PAV1@IPAUCCreateContext@@@Z)
LNK2001とLNK2019のMSDNページを読んだ後、何が起こっているのかわからないことに気づきました。これらは、彼らが学校でどのように対処するかを私たちに教えてくれたような問題ではありません。私は自分のデータ構造を知っています、そしてそれはそれについてです。私が今いる場所にたどり着いた方法は私を超えています!
私の限られた知識から、これらのモジュールのさまざまなデバッグバージョンとリリースバージョンはすべて、プリプロセッサディレクティブと#includeのWebに絡み合っているようです。環境変数、ファイル名、マクロなどのソリューション全体で、ほぼすべてのヘッダーファイルとソースファイルで、ネストされた#ifdefチェックと#defineステートメントが多数実行されます。コンパイラの設定に少しでも変更を加えることで、プログラムの大部分を、関数定義が大きく異なるさまざまなライブラリにリダイレクトしているように見えます。これは、何が起こっているのかについての私の漠然とした概念的な理解です。
これらのコンパイラエラーのトラブルシューティングを行う前に、このコードがどのように機能するかをよりよく理解する必要があるように感じます。そのために、私は多くのファイルを1行ずつ調べて、それらがどこにつながるか、どのオブジェクトと変数がスコープ内にあるかなどを確認しようとしています。残念ながら、外部関数へのすべての呼び出しはあいまいであり、特定の関数のどのバージョンが呼び出されるかを知るためにプリプロセッサの混乱を確認する方法がないため、これはあまりわかりません。
私は、プログラムを計画し、それを理解しようとする魔法の解決策を探していました。Doxygenと呼ばれるものを試しましたが、適切に使用する方法がわからないか、プリプロセッサのものと同じように混乱しています。
私の質問はこれです:
私の残りのオプションは何ですか?
この時点で、それは次の間にトスアップです:
a。)メジャーを切り替える
b。)橋から飛び降りる
これらの選択はどちらも、このコードベースをよりよく理解してコンパイルするのに役立ちません。誰かもっと良いアイデアはありますか?同様の経験?賢者の知恵を共有しますか?
トンありがとう、-
アレックス