2010-11-29 3 views
3

私はVS2008のいくつかのライブラリにリンクしています。リンカーについての私の知識が正しいなら、MTdは静的リンク用で、MDdはDLLへの動的リンク用です。私の目標は、いくつかのライブラリと動的リンクを静的にリンクすることです。プロジェクトオプションは、リンカ入力のすべてのライブラリに対して1つの設定しかないようです。どうすればいい?Visual Studio:リンカに異なるランタイムライブラリを指定するにはどうすればよいですか? (/ MTd、MDdなど)

+1

私はそれが私を助ける方法を理解していない。ライブラリごとにリンカオプションを指定する方法はありません。 –

答えて

3

新しいプロジェクトウィザードのプロンプトにどのように応答するかに応じて、プロジェクトを設定した後でCランタイムライブラリがデフォルトになります。あなたは検査し、(必要に応じて)次のようにこれを変更することができます、[プロパティ]を選択構成プロパティの下

  • 見て、C/C++、コード生成、ランタイムライブラリ

    • ソリューションエクスプローラで該当するプロジェクトを右クリックします。

    他のライブラリをリンクすることもできますが、リンクするライブラリをリンカ、入力、追加の依存関係に指定するだけです。

    DLLを手動でロードして必要な機能エントリポイントを検出しない限り、DLLにリンクしている場合でも外部参照を解決するための.LIBファイル(DLL用の正しい形式)があります。

    あなたのアプリケーションと同じCRTを使用するためにリンクするLIBファイルが間違っているかどうかを確認する必要があります。

  • +0

    私はお互いを理解しているとは思わない。あなたの答えは、あなたがこれについて知っていると私に伝えますが、私はおそらく理解していません。私のランタイムライブラリは "マルチスレッドデバッグ(/ MTd)"で、リンカーの入力は "cg.lib cgD3D9.lib Winmm.lib wininet.lib fbxsdk_20113_1d.lib d3d9.lib d3dx9.lib dinput8.lib dxguid.lib"正しいか?これは、デバッグを混在させてライブラリをリリースすると問題が発生するためです。 –

    +1

    ここに付属情報のハンスの答えをチェックしてください。 '/ Mxxx'フラグはあなたの現在のプロジェクト**へのCRTバージョン**のみを決定します - すべてのアプリケーションはCRTにリンクしなければなりません。あなたが使用したい**その他の**ライブラリは、プロジェクトのプロパティに名前が付けられています。静的でも動的でも構いませんが、DLLにリンクする予定がある場合は、アプリケーションのCRTがDLL対応であることを確認する必要があります。任意の明確な? –

    +0

    私はこれをもっとよく理解していると信じています:)あなたの忍耐力に感謝します。プロジェクトで/ Mxxxを指定しても、リンカが入力を受け入れる方法に影響はありません。それがCRTへのリンク方法を変更しますか? –

    4

    いいえ、あなたはそれを混ぜています。/MD対/ MTオプションは、あなたがリンクしているCRTバージョンにのみ関連しています。 2つの静的バージョン(/ MT)は、プロジェクトでDLLを使用していない場合にのみ使用する必要があります。そして、あなたのプロセス内のすべてのバイナリが共有することができるバージョンであるDLLバージョンでは、ヒープ割り当ての不幸はなくなります。メモリが1つのモジュールによって割り当てられ、別のモジュールによって解放されたときの悲惨な種類。

    独自のライブラリを選択することは、あなた次第です。ミキシングとマッチングはうまくいきます。リンカは別の種類の.libを取得します。静的ライブラリの代わりにインポートライブラリ。 DLLを使用するときは、/ MDを使用することを覚えておいてください。

    +0

    これは正しい軌道にあるようです。上記の答えに私のコメントをお読みください。私は現在、デストラクタの終わりにプログラムがクラッシュしていて、何の理由もなくクラッシュしているという問題を抱えています。これは、デバッグライブラリとリリースライブラリを混ぜているためです。静的/動的/デバッグ/リリースを任意の組み合わせでリンクするように指定できる方法で、ライブラリを混在させる方法はありますか? –

    +2

    ヒープの破損は、デストラクタがクラッシュする最も一般的な理由です。しかし、ええ、私が与えた特定の警告は適合します。デバッグとリリースを混在させると、STLイテレータのデバッグで悲惨さが増すことがありますが、通常は早く爆発します。 –

    +0

    美しい答え。ありがとうございました。私の問題を解決しました。 – CroCo

    0

    説明しているリンカーオプションはCRTのみです。静的バージョンは、モジュール間でメモリを共有する方法を制限します。

    あなたが使用する他のすべてのライブラリは、リンカに提供する(またはしない).libファイルに基づいてリンクされます。

    1. が静的​​
    2. は静的(.LIBコンパイラが生成されたスタブをリンク(.oのの.Aアーカイブの.LIB equivelant)静的ライブラリをリンクするMSライブラリを使用するには3通りの方法がありますLOADLIB/getproc)手動でダイナミックライブラリをロード
    3. 動的ライブラリの(LOADLIB/GetProcAddressが)
    0

    あなたはMTで事前構築されたのlibにリンクしていて、MDを求めているならば、私の問題はそうどこですることが。

    の場合も同様です。

    MTを選択すると、私は現在キャッチ22に巻き込まれているので、外部依存関係をダウンロードして再構築する必要があると思います。プロジェクト/ソリューションの一部でビルドエラーが発生しました。 MD私は別の部分のためのエラーを得る。

    関連する問題