質問
C ++では、静的ライブラリAは動的ライブラリBおよびCにリンクされます。Bで定義されているクラスFooがAで使用されている場合、Fooを使用しないとCはリンクしますか?
答えはイエスだと思ったが、今ではxlc_r7で問題が発生しており、ライブラリCはFooが未定義のシンボルであると言っており、これはCに関する限りです。私の問題は、ライブラリCがそれを参照するクラスを使用していないことです。これはWin32(VC6)とOpenVMSにリンクしています。
これはリンカーの不一致ですか、それともPBCAKですか?
新しい情報:
-
BはCに依存していますが、ビザの逆ではありません。
-
Windowsでリンクするために/ OPT:REFを使用しておらず、問題なくリンクしています。
解決
静的にリンクすると、2つのモジュールが1つになります。したがって、CをコンパイルしてAをリンクすると、AのすべてのソースコードをCのソースコードにコピーし、結合されたソースをコンパイルしたかのようになります。したがって、C.dllにはAが含まれており、AはFooを介してBに依存しています。その依存関係を満たすには、CをBのリンクライブラリにリンクする必要があります。
情報によると、これによりBとCの間に循環依存関係が作成されることに注意してください。
他のヒント
おそらくリンカー(ld / unix)のように聞こえます。(私が使用したほとんどのバージョン)ldがライブラリを左から右にリンクし、最初のライブラリに必要な参照がある場合後の1つは、最初のライブラリ(または必要なライブラリ)をコマンドの最後に追加することです。
試してみてください...
Bのエクスポートライブラリを含むCのリンク行ですか?もしそうなら、リチャードが示唆するように、それは注文のもののように聞こえます。
別の提案は、CがAからその機能を必要としない場合、参照されていないシンボルを無視するリンカーオプションがあるかどうかを確認することです。Microsoftリンカーの場合、これは/ OPT:REFスイッチで実現します。
Cがリンクしない唯一の理由は、コンパイラがFemシンボルを必要とする と考えるからです。
CはFooシンボルを参照しないため、リンカーがシンボルを必要とする別の理由が必要です。
私が知っている他の唯一の理由は、ある種の輸出です。私はVisual C ++のみを知っているので、前処理されたファイルで __ declspec(dllexport)
に相当するものを検索し、それを生成するものを確認することをお勧めします。
これが私がやることです。プリプロセッサの出力を別のファイルに保存し、Fooの出現を検索します。エクスポートとして発生するか、コンパイラによって何らかの方法で参照されています。
特定の関数の定義が不要な場合、そのライブラリはリンク段階でリンクされません。あなたの場合、fooの定義はライブラリCではなくライブラリBに存在するため、実行可能ファイルの読み込み中にライブラリCはメモリに読み込まれません。
しかし、ライブラリCでもfoo()関数を使用しているようです。そのため、対応するエラーが発生しています。