1

昨日、友人がIntel の MKL Java サンプルをコンパイルするのを手伝っていました。すべてが問題ないように見えたにもかかわらず、「未解決の外部」に問題がありました (サンプル ファイル/メイクファイルによると)。

次に、Visual Studio のダンプビンを使用して、未解決の関数がライブラリに存在するかどうかを確認しました。未解決の外部の 1 つの例は、 と呼ばれる関数_cblas_sgemmです。ライブラリ ( ) からシンボルをダンプすると、接頭辞が欠落しているライブラリdumpbin /symbols mkl_core.libの関数しか見つかりませんでした。その後、この関数は実際には cblas_sgemm としか呼ばれておらず、名前マングリング ルールの一部としてコンパイラが接頭辞を追加したことを発見しました。cblas_sgemm__

TL;DR

だから、私の質問は次のとおりです。

  1. dumpbinライブラリのエントリ ポイントの完全な名前を表示しますか? または、何らかの理由で、実際に名前を「解読」しますか?
  2. ライブラリはインストール パッケージに付属しているため、どのコンパイラを使用してコンパイルしたかはわかりません。異なるコンパイラは異なる名前を生成しますか?

私はそれが正しかったとは本当に思いません。おそらくどこかで何か間違ったことをしているのでしょうが、これら2つの質問について確認したいと思います。

回答のない同様の質問はこちらです。

4

1 に答える 1

2
  1. dumpbinライブラリ内(ソース内ではなく)のシンボルの完全な名前を、変更なしで表示します。MS が C++ 名をマングルした場合、元のシンボルを括弧内に表示します (元のシンボルを特定できる場合)。(ダンプビン 9.00.21022.08 でテスト済み)

  2. 特に C++ シンボルの場合、異なるコンパイラは異なるシンボルを生成します。シンボルの場合、コンパイラは名前マングリングについて合意している傾向があるため、extern "C"異なるコンパイラ間でシンボルをリンクできます。

これは、名前マングリングに関するウィキペディアの記事です。

于 2011-12-02T12:47:48.460 に答える