質問

C ++では、静的ライブラリAは動的ライブラリBおよびCにリンクされます。Bで定義されているクラスFooがAで使用されている場合、Fooを使用しないとCはリンクしますか?

答えはイエスだと思ったが、今ではxlc_r7で問題が発生しており、ライブラリCはFooが未定義のシンボルであると言っており、これはCに関する限りです。私の問題は、ライブラリCがそれを参照するクラスを使用していないことです。これはWin32(VC6)とOpenVMSにリンクしています。

これはリンカーの不一致ですか、それともPBCAKですか?

新しい情報:

  1. BはCに依存していますが、ビザの逆ではありません。

  2. 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()関数を使用しているようです。そのため、対応するエラーが発生しています。

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