質問

/MTでコンパイルされた大量のコードがあります(つまり、CRTに対して静的にリンクすることを期待しています)。これを /MDで構築された静的なサードパーティライブラリと組み合わせる必要があります(つまり、CRTを動的にリンクすることを期待しています)。

また、2つを再コンパイルせずに2つを1つの実行可能ファイルにリンクすることは可能ですか?

/nodefaultlib:msvcrtとリンクすると、次のようなものへの少数の未定義の参照があります __imp__wgetenv. 。私はこれらの関数を自分のコードに実装して、転送しようとしています wgetenv, など、それは試してみる価値がありますか、それとも次の問題に直接走りますか?

残念ながら、サードパーティのコードを別のdllに梱包する簡単なオプションを取得することは禁じられています: - /

役に立ちましたか?

解決

No. /MTおよび /MDは相互に排他的です。

リンカーの特定の呼び出しに渡されたすべてのモジュールは、同じランタイムライブラリコンパイラオプションでコンパイルされている必要があります(/MD, /MT, /ld).

ソース

他のヒント

OpenSSLソースでそのようなソリューションを見つけました。ライブラリのすべてのOBJファイルは、組み合わせでコンパイルされています。 /MT /Zl. 。著者が説明したように、このような組み合わせにより、動的CRTのいずれかのアプリケーションでコンパイルする機能を備えた静的ライブラリを構築できます(/MD)または静的CRT(/MT).

私は同様の状況に直面しました。この状況では、2つのライブラリがMTで建設され、もう1つはMDで別のライブラリが建設されました。両方のライブラリから機能を使用する実行可能ファイルを構築する必要がありました。 MDとして構築されたライブラリは第三者であるため、MTが多くの依存関係を持っているためにライブラリを構築することはできませんでした。サードパーティの構成ヘッダーファイルからエラーが発生していたため、実行可能ファイルをMDとして構築することが必須でした。問題で言及されているように、サードパーティのDLLを別のDLLとしてパッケージ化する簡単な方法を探していました。しかし、この簡単な方法でオンラインで十分な説明を見つけることができませんでした。したがって、私の2セント以下です。以下は私がそれを回避する方法です

  1. インターフェイスとして機能する別の.dllを作成しました。このインターフェイスは、基本的に、サードパーティのDLLに作成されたすべてのAPI呼び出しをラップしました。このインターフェイスのヘッダーファイルには、サードパーティのdllからのヘッダーファイルが含まれていませんでした。予想通りのインターフェイスはMDとして構築されました。
  2. Main.cppファイルに、このインターフェイスヘッダーファイルを含めて、インターフェイスを介してサードパーティのDLLへのすべての呼び出しを行いました。

  3. インターフェイスに引数を渡す際には、余分な注意を払う必要があります。 int、boolなどの基本的な変数は、値として渡すことができます。ただし、ヒープの腐敗を避けるために、constの参照としてクラスまたは構造を渡す必要があります。これは偶数文字列に適用できます。

明確でない場合は、詳細を共有していただきます!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top