2

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

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

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

新しい情報:

  1. BはCに依存しますが、その逆はありません。

  2. / OPT:REFを使用してWindowsでリンクしていませんが、問題なくリンクしています。

4

5 に答える 5

4

静的にリンクすると、2つのモジュールが1つになります。したがって、CをコンパイルしてAをリンクすると、AのすべてのソースコードをCのソースコードにコピーしてから、結合されたソースをコンパイルしたかのようになります。したがって、C.dllにはAが含まれており、Fooを介してBに依存しています。その依存関係を満たすには、CをBのリンクライブラリにリンクする必要があります。

あなたの情報によると、これはBとCの間に循環依存関係を作成することに注意してください。

于 2008-10-04T00:53:39.607 に答える
0

(私が使用したほとんどのバージョンの)ldはライブラリを左から右にリンクしているので、おそらくリンカー(ld / unix)のように聞こえます-最初のライブラリに参照があり、後のライブラリで必要になる場合通常のトリックは、最初のライブラリ(または必要なライブラリ)をコマンドの最後に追加することです。

試してみてください。

于 2008-10-03T21:40:49.670 に答える
0

CのリンクラインにはBのエクスポートライブラリが含まれていますか?もしそうなら、リチャードが示唆するように、それは注文のように聞こえます。

もう1つの提案は、CがAの機能を必要としない場合に、参照されていないシンボルを無視するリンカーオプションがあるかどうかを確認することです。Microsoftリンカーの場合、これは/ OPT:REFスイッチで実現されます。

于 2008-10-03T22:04:35.237 に答える
0

C がリンクしない唯一の理由は、コンパイラがFoo シンボルが必要だと考えているからです。

C は Foo シンボルを参照しないため、リンカがシンボルを必要とする別の理由が必要です。

私が知っている唯一の他の理由は、ある種の輸出です。私は Visual C++ しか知らないので__declspec( dllexport )、前処理されたファイルで に相当するものを検索し、それを生成するものを確認することをお勧めします。

プリプロセッサの出力を別のファイルに保存し、Foo の出現を検索します。エクスポートとして発生するか、コンパイラによって何らかの方法で参照されています。

于 2008-10-04T11:21:16.517 に答える