6

こんにちは業界のベテラン、

私は大学の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)

LNK2001LNK2019のMSDNページを読んだ後、何が起こっているのかわからないことに気づきました。これらは、彼らが学校でどのように対処するかを私たちに教えてくれたような問題ではありません。私は自分のデータ構造を知っています、そしてそれはそれについてです。私が今いる場所にたどり着いた方法は私を超えています!

私の限られた知識から、これらのモジュールのさまざまなデバッグバージョンとリリースバージョンはすべて、プリプロセッサディレクティブと#includeのWebに絡み合っているようです。環境変数、ファイル名、マクロなどのソリューション全体で、ほぼすべてのヘッダーファイルとソースファイルで、ネストされた#ifdefチェックと#defineステートメントが多数実行されます。コンパイラの設定に少しでも変更を加えることで、プログラムの大部分を、関数定義が大きく異なるさまざまなライブラリにリダイレクトしているように見えます。これは、何が起こっているのかについての私の漠然とした概念的な理解です。

これらのコンパイラエラーのトラブルシューティングを行う前に、このコードがどのように機能するかをよりよく理解する必要があるように感じます。そのために、私は多くのファイルを1行ずつ調べて、それらがどこにつながるか、どのオブジェクトと変数がスコープ内にあるかなどを確認しようとしています。残念ながら、外部関数へのすべての呼び出しはあいまいであり、特定の関数のどのバージョンが呼び出されるかを知るためにプリプロセッサの混乱を確認する方法がないため、これはあまりわかりません。

私は、プログラムを計画し、それを理解しようとする魔法の解決策を探していました。Doxygenと呼ばれるものを試しましたが、適切に使用する方法がわからないか、プリプロセッサのものと同じように混乱しています。

私の質問はこれです:
私の残りのオプションは何ですか?

この時点で、それは次の間にトスアップです:
a。)メジャーを切り替える
b。)橋から飛び降りる

これらの選択はどちらも、このコードベースをよりよく理解してコンパイルするのに役立ちません。誰かもっと良いアイデアはありますか?同様の経験?賢者の知恵を共有しますか?

トンありがとう、-
アレックス

4

3 に答える 3

3

CodeProjectのCResizableSheetとCResizeablePageを使用しているようです。そのページからコンパイルされた静的ライブラリを使用している場合は、ソースをダウンロードして、一致する/ MDd設定でコンパイルし、プロジェクトのリンカー入力セクションに出力される.libを使用してみてください。また、すべてをクリーンアップして([ビルド]->[バッチビルド]->[すべて選択]に移動し、[クリーン]をクリックして)、ビルドを再試行して、すべてが最新であることを確認することもお勧めします。

于 2012-07-13T22:49:42.673 に答える
2

看護は素晴らしいプログラムだと聞きました...

衒学的になるリスクがありますが、あなたが戦っているのはリンカーエラーであり、コンパイラエラーではありません。これに対する私の基本的なアプローチは、新しいソリューションを作成し、プロジェクトを1つずつ追加して、各プロジェクトを順番にビルドすることです。

また、各プロジェクトの設定を可能な限り標準化することを真剣に検討したいと思います。これを行う最も簡単な方法は、新しいソリューションで空のプロジェクトを作成し、既存のコードをそれらにコピーすることです。

まず、次の設定(MFCに関連)を想定する必要があります。

デバッグ:共有DLLでMFCを使用、/ MDd
リリース:共有DLLでMFCを使用、/ MD

MDdとMDは同じモードですが、デバッグ用の追加情報を使用してデバッグライブラリにリンクします。

そうすれば、一度に1つのプロジェクトに取り組むだけで済みます。提案されたように新しいソリューションを作成する場合は、プロジェクト間の依存関係ツリーを再構築する必要があることに注意してください。(プロジェクトを右クリックして[依存関係]を選択すると、意味がわかります。)

これを行う際に問題が発生した場合は、職場の上級開発者と友達になる必要があります=)。

于 2012-07-13T22:52:53.220 に答える
1

同じランタイムライブラリですべてをコンパイルします。物語の終わり。

于 2012-07-16T21:39:02.187 に答える