Visual Studio C ++ 2008 Expressの使用:
次のようにコンパイルされたビルドで最後のリンクステップを実行しようとしています。
ライブラリ
foo.lib
は、スイッチを使用して静的にコンパイルされます(ビルドはを生成しません.dll
)/MD
。のビルドはfoo.lib
成功します。ファイルとヘッダーは.lib
、以下のライブラリのプロジェクトがそれらを見つけることができるディレクトリに出荷されます。foo.lib
ソースはアンマネージC++で記述されています。ライブラリは、スイッチ
bar.dll
を備えたダイナミックライブラリとしてコンパイルされます。エクスポートされたシンボルに依存します。とは両方とも、VS2008Expressツールチェーンの同じバイナリとバイナリを使用してソースから構築されます。ソースはアンマネージC++で記述されています。/MD /LD
bar.dll
foo.lib
bar.dll
foo.lib
cl.exe
link.exe
bar.dll
ビルドのすべての
.obj
ファイルはbar.dll
正常にビルドされますが、それを最後に実行link.exe
するとbar.dll
、未定義の外部ファイルに関する何千ものエラーが発生します。LNK2001
未定義の外観はすべて、標準C ++ライブラリにあると私が期待するものです。std::basic_string
コンストラクター、std::_Throw
クラス、ostream
オーバーロードされた演算子などです。未定義の外観は!内で未定義でlink.exe
あると言いますfoo.lib
目標は、
bar.dll
静的にリンクされたコード全体foo.lib
とそれ自体のオブジェクトを含めることですが、実行時の存在/解決に動的に依存MSVCR90.dll
しMSVCP90.dll
ます。
このビルドで不可能な状況を設定しようとしていますか、それとも単に何か間違ったことをしていますか?これが理論的にまったく機能しない場合は、私に知らせてください。foo.lib
それ以外の場合は、最後のリンク手順でC++ライブラリシンボルを使用できない理由を特定するためにどのような診断を試みることができるかを教えてください。
編集:より具体的な情報:LLVM 3.1でありfoo.lib
、ブランチからのMesaの()ビルドです(目標はで実行されるものを生成することです)。次のように、すべてのビルド依存関係を満たしました。bar.dll
libgl-gdi
llvmpipe
master
opengl32.dll
llvmpipe
- LLVMビルドは、ビルドシステムとしてのCMakeとPython2.7に依存しています。
- Mesaビルドは、ビルドシステムとしてSCons、LLVM 2.6以降、Python 2.7、pywin32、python-libxml2、bison、およびflexに依存しています。上記のうち、実行時にLLVMのみが出荷されます。残りは、ビルドプロセス中に使用される単なる「ツール」です。
また、プロジェクトごとにビルドをカスタマイズして、環境変数を設定し、スイッチのみを一貫して使用し/MD
、/MT
間違ったCランタイムライブラリを選択するために他のスイッチを使用しないようにしました。