2011-12-26 6 views
2

私はリンクプロセスについては何も知らず、新しいプロジェクトを開始しようとしているときや新しいライブラリを追加しようとしているときにほとんどいつも邪魔になります。これらのタイプのエラーに対する修正を検索するたびに、同様の問題を抱えている人はほとんどいませんが、修正はほとんどありません。C++リンカの問題は、これらのトラブルシューティングを行う一般的な方法はありますか?

問題が何であるかを特定して修正する一般的な方法はありますか?

私はVisual Studio 2010を使用しており、ライブラリを自分のプログラムに静的にリンクしています。私の問題は、常にLIBCMT(D).lib、MSVCRT(D).lib、および特定の機能を二重に定義する他のいくつかのライブラリとの競合に起因するようです。まったく問題がなければ、私の意図は「管理された」C++の使用を避けることです。

+2

何かについては何も知らず、トラブルシューティングのための一般的な方法を求めています...ここでは最高の薬が予防であることは明らかです。ベストプラクティスを使用してエラーを防ぎ、トラブルシューティングを行うための仕組みを学びましょう。 – tenfour

+0

大丈夫、ちょうどそれについて下塗りを読んでください。私はそれについて多くの嫌悪感を抱いています。この日にリンカーが存在しないようにする方法のように。しかし、私はそれは私が推測することができます。私は少なくとも、コンセプトと今彼らが何をすべきかを理解しています。 –

+0

[リンカの簡単な紹介](http://blogs.msdn.com/b/oldnewthing/archive/2009/10/12/9905953.aspx) –

答えて

2

エラーがLIBCMT(D).libなどと関連している場合は、通常、あなたのCRTバージョンとは異なるCRTバージョンを使用しているライブラリにリンクしていることが原因です。唯一の現実的な修正は、使用しているCRTの同じバージョン用にコンパイルされたライブラリを使用することです(このような理由でしばしば "デバッグ"と "リリース"のバージョンがあります)、CRTのバージョンを変更するライブラリの1つと一致するために使用します。

舞台裏で起こっていることは、プログラムとライブラリの両方がCRT機能を正しく動作させる必要があり、それぞれがすでにそれにリンクしているということです。それらが同じバージョンのものとリンクしている場合、何も悪いことはありません(リンカーは同じであるとみなし、不平を言わない)。そうでなければ、同じ関数の複数の矛盾した実装があるので、リンカーはどちらが正しいかを知らないどちらのオブジェクトモジュール(2つのCRTの内部データ構造も互換性がないため、バイナリ互換ではないため)。

+0

それはまさにその通りです。共有ライブラリを使用するのではなく、STDライブラリに静的にリンクするライブラリを設定しました。したがって、libcmtの複数の定義済みのものすべてありがとう! –

+0

@Clairvoire:これは静的ライブラリでよく見られる問題です。そのため、たとえばBoostでは、利用可能なすべてのCRT用の静的ライブラリを生成する必要があります(また、VC++ 2003では、単一スレッド静的マルチスレッド静的マルチスレッドDLLのすべてのDebug/Releaseの組み合わせがありました)。 –

1

上記のリンクエラー(LIBCMT(D).lib、MSVCRT(D).libライブラリ)は、プログラム内のモジュール/ライブラリ間のコード生成オプションの競合に関連しています。

モジュールをコンパイルすると、コンパイラは結果の.objに自動的にランタイムライブラリ(LIBCMT & MSVCRT)への参照を挿入します。さて、各コード生成モードのためのこれらのライブラリの1つのバージョンがあります(私は設定プロパティ - > C/C++ - >コード生成 - >ランタイムライブラリのオプションを参照しています)。したがって、異なるモードでコンパイルされた2つのモジュールがある場合、それらのライブラリのそれぞれが異なるバージョンのライブラリを参照し、リンカは両方をインクルードしようとしますが、基本的にすべてのシンボルが同じであるためこれらのライブラリでは、実装だけが異なります。

溶液は3つの部分に分かれています。まず、プロジェクト内のすべてのモジュールが同じモードを使用していることを確認します。第2に、プロジェクト間に依存関係がある場合は、すべて同じモードを使用する必要があります。第三に、サードパーティのライブラリを使用する場合は、使用するモードを知っているか(または採用しているか)、目的のモードで再コンパイルできる必要があります。

最後のものが最も難しいです。ライブラリがプリコンパイルされていることがあります。また、プロバイダが使用するモードに関する情報を提供するとは限りません。さらに、複数のサードパーティライブラリを使用している場合、競合するモードがある可能性があります。そのような場合、試行錯誤よりも良い選択肢はありません。

各Visual Studioバージョンには独自のランタイムライブラリセットがありますので、サードパーティライブラリを使用する場合は、使用しているVisual Studioの同じバージョンでコンパイルしたものを使用する必要があります。プロバイダが提供していない場合、唯一の選択は自分自身を再コンパイルすることです。

関連する問題